如何确定分布式系统中事件的发生顺序?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
首先,我们来观察一个「如何确定分布式系统中事件的发生顺序」的问题:
在这个分布式系统中,有三个独立的进程A、B、C:
首先,进程A中发生了一个事件a,并把这个事件消息同步给另外两个进程B和C。
B收到消息后,发生了一个事件b,并把这个事件消息同步给进程C。
但是由于无法确定的网络延迟原因,导致进程A发出的消息到达C晚于进程B发出的消息到达C,这样 进程C的视角上,最终看到的事件顺序是 b,a,但是这与事实是相悖的。 可以看到,在分布式通信中,由于网络延迟的不确定性, 仅仅以接收顺序作为整个分布式系统中事件的发生顺序是不可取的。
下面我们再观察一个稍微现实点的例子。 1. 假设朋友圈有三个数据中心,分别在北京、维也纳和纽约。 2. 北京小明在朋友圈中发了一张风景图,并问到「猜猜这里是哪里?」,这条消息被扩散到其他数据中心。 3. 维也纳的小红看到这个消息后,回复说她知道。这条回复也被扩散到其他数据中心。 4. 但是由于无法确定的网络延迟的原因,导致纽约的数据中心先收到小红的回复,而后收到了原始的提问消息。 这样,导致最终小李看到的问答顺序是不符合问答的因果一致性的。
以上的例子,是腾讯微信朋友圈真实碰到并解决的问题。 详细的介绍见 微信朋友圈技术之道。
下面是微信朋友圈架构设计的两个关于因果一致性算法设计的PPT截图:
在腾讯的分享PPT中,提到了「向量时钟」, 不过我们稍后再揭开它的神秘面纱。
而这两个例子中,我们面临的要解决的问题, 其实是分布式系统中的因果一致性, 换句话说,就是如何准确刻画分布式中的事件顺序, 显然仅仅简单地依靠进程接收到的(看到的)事件发生顺序是不准确的。