4

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

  1. 线程中的每条消息都必须有一个订单号,以反映它基于时间在线程中的位置。例如,通过说“thread1/message10”,我可以在线程 #1 中获取消息 #10
  2. 一旦新消息被添加到线程,系统必须能够为其分配一个对于所有服务器上的所有线程实例都一致的订单号,并且该号码永远不能改变。

我想知道是否有任何已知的解决方案、库或算法可以帮助我实现第二个选项,因为现在我认为这是一个大问题,因为由于许多因素,不同的服务器可以在不同的时间收到相同的消息,这可能会影响它订单号。

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

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

  • 基于 UTC 时间戳的排序。当每个线程收到一条新消息时,我会说前面 10 条已经具有正确订单号的消息,提取它们的时间戳并通过在最后 10 个时间戳的列表中找到它的时间戳来确定新消息的订单号。我猜这可能可行,但它确实需要可以分配一些消息的订单号,然后在某些时候进行更改,这是不可接受的。此外,我不确定当大量传入消息时这是否会正常工作。

感谢所有的帮助。

4

1 回答 1

5

这是称为原子广播的分布式系统中的一个基本问题,有许多解决方案提供不同的性能和适用性权衡(请参阅维基百科页面引用的调查)。在实践中,最常用的是基于Paxos(例如libpaxos)或 Totem(例如CorosyncSpread)。选择其中之一时的一个关键问题是,如果网络分区,您期望会发生什么:它应该停止排序消息(块)还是应该为每个分区产生独立的订单?

于 2013-08-21T10:52:46.150 回答