知识卡片

排序事件以捕获因果关系的应对思路

普通读书笔记卡

内容

在[[全序广播随系统伸缩而遇到的四种限制场景]]导致全序不可行的场景里,若事件之间没有因果关系,缺乏全序其实无伤大雅——并发事件本就可以任意排序;同一对象的多次更新也容易处理,把特定对象ID的所有更新路由到同一日志分区即可完全排序。但因果关系有时以更微妙的方式出现:一对情侣分手后,一方把对方移出好友列表,随后向剩余好友抱怨前任——发消息的人期望前任看不到这条消息,因为发送发生在解除好友之后。但如果好友关系和消息存储在不同地方,”解除好友”事件与”发送消息”事件之间的因果依赖就可能丢失:负责发通知的服务可能在处理”解除好友”之前先处理了”发送消息”,从而错误地把通知推给了前任——这本质上是[[三种流连接类型及其时间依赖性带来的不确定性]]里连接的时序问题的又一种表现,因为”通知”实际上是消息流与好友列表流之间的一次连接。可能的应对思路包括:用逻辑时间戳提供无需协调的全局顺序(但接收方仍要处理乱序到达并携带额外元数据);记录用户做决定之前所见的系统状态、给该事件唯一标识符,让后续事件引用它来显式记录因果关系;用冲突解决算法处理乱序到达的事件(但对有外部副作用如发通知的操作无能为力)。这个问题目前并没有简单的通用答案。

参考来源

- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"排序事件以捕获因果关系"(源文件:_epub-src/ch12_split_000.html) - 结论依据:原文用社交网络"解除好友后发消息抱怨前任"的例子说明跨系统因果依赖丢失导致错误通知的问题,并列举逻辑时间戳、事件唯一标识符引用、冲突解决算法三种起点性思路,直接支撑本卡片结论。 - 原始内容:如果因果依赖关系没有被捕捉到,则发送有关新消息的通知的服务可能会在解除好友事件之前处理发送消息事件,从而错误地向前任发送通知……不幸的是,这个问题似乎并没有一个简单的答案。