分布式系统中的消息排序

时间:2013-08-20 14:31:00

标签: system messaging distributed

我想构建一个分布式系统,其中我有“线程”(具有自己的ID的消息集合,而不是系统进程),它们分布在许多服务器上。这些线程必须具有两个关键属性:

  1. 线程中的每条消息都必须有一个订单号,它反映了它在线程中基于时间的位置。例如,通过说“thread1 / message10”,我可以在#1号线
  2. 中找到消息#10
  3. 一旦新消息被添加到线程,系统必须能够为其分配一个与所有服务器上的所有线程实例一致的订单号,并且该号码必须永远不会更改。
  4. 我想知道是否有任何已知的解决方案,库或算法可以帮助我实现第二个选项,因为现在我认为它是一个大问题,因为由于许多因素,不同的服务器可以在不同的时间获得相同的消息可能会影响它的订单号。

    到目前为止,只是为了概述我对一个问题的看法,我说有3个服务器和我的分布式线程已经包含5条消息,每个服务器都会向它自己的线程发送一条新消息,剩下两条消息。

    • 天真的订购。每个服务器认为它自己的消息号是6,其他服务器的剩余两个消息将在到达时获得它们的数字,具体取决于网络延迟和许多其他随机因素,因此订单号在服务器之间不一致。这是不可接受的。

    • 基于UTC时间戳的排序。当每个线程获得一条新消息时,我会说已经有10个已经有正确订单号的消息,提取它们的时间戳并通过在最近10个时间戳列表中找到它的时间戳位置来确定新消息的订单号。 这可能有用,但我确实需要分配一些消息的订单号,然后在某些时候改变这是不可接受的。此外,我不确定当一些收到的消息是巨大的时候这是否正常。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是分布式系统Atomic Broadcast中的一个基本问题,有许多解决方案提供不同的性能和适用性权衡(参见维基百科页面引用的调查)。在实践中,最常用的是基于Paxos(例如libpaxos)或图腾(例如CorosyncSpread)。选择其中之一时的一个关键问题是,如果网络分区,您希望发生什么:它应该停止订购消息(阻止)还是应该为每个分区生成独立订单?