开发者社区 问答 正文

如何确定分布式系统中事件的发生顺序?

如何确定分布式系统中事件的发生顺序?

展开
收起
kun坤 2020-04-24 11:32:49 743 分享 版权
1 条回答
写回答
取消 提交回答
  • 首先,我们来观察一个「如何确定分布式系统中事件的发生顺序」的问题:

    在这个分布式系统中,有三个独立的进程A、B、C:

    1. 首先,进程A中发生了一个事件a,并把这个事件消息同步给另外两个进程B和C。

    2. B收到消息后,发生了一个事件b,并把这个事件消息同步给进程C。

    3. 但是由于无法确定的网络延迟原因,导致进程A发出的消息到达C晚于进程B发出的消息到达C,这样 进程C的视角上,最终看到的事件顺序是 b,a,但是这与事实是相悖的。 01.jpg 可以看到,在分布式通信中,由于网络延迟的不确定性, 仅仅以接收顺序作为整个分布式系统中事件的发生顺序是不可取的。

    下面我们再观察一个稍微现实点的例子。 1. 假设朋友圈有三个数据中心,分别在北京、维也纳和纽约。 2. 北京小明在朋友圈中发了一张风景图,并问到「猜猜这里是哪里?」,这条消息被扩散到其他数据中心。 3. 维也纳的小红看到这个消息后,回复说她知道。这条回复也被扩散到其他数据中心。 4. 但是由于无法确定的网络延迟的原因,导致纽约的数据中心先收到小红的回复,而后收到了原始的提问消息。 这样,导致最终小李看到的问答顺序是不符合问答的因果一致性的。

    02.jpg 以上的例子,是腾讯微信朋友圈真实碰到并解决的问题。 详细的介绍见 微信朋友圈技术之道。

    下面是微信朋友圈架构设计的两个关于因果一致性算法设计的PPT截图: 03.jpg

    04.jpg

    在腾讯的分享PPT中,提到了「向量时钟」, 不过我们稍后再揭开它的神秘面纱。

    而这两个例子中,我们面临的要解决的问题, 其实是分布式系统中的因果一致性, 换句话说,就是如何准确刻画分布式中的事件顺序, 显然仅仅简单地依靠进程接收到的(看到的)事件发生顺序是不准确的。

    2020-04-24 11:38:54
    赞同 展开评论
问答标签:
问答地址: