分布式队列问题有哪些解决方案?


23

我正在尝试了解有关解决分布式队列问题的各种方式的更多信息。因此,我想知道已经有哪些产品,服务,实现和研究论文。

一个实现将面临许多挑战,并将被迫进行权衡:

  • 它的订购顺序是否牢固?
  • 它有幂等的位置吗?
  • 我们是否可以拥有比一台计算机上容纳的队列更多的队列?
  • 队列中的数据量是否可以超过一台计算机上容纳的数据量?
  • 在可能丢失数据之前,有多少台计算机可能崩溃?
  • 它可以承受网裂吗?
  • 固定网络拆分后,能否自动协调数据?
  • 客户崩溃时能否保证交货?
  • 是否可以保证同一封邮件不会多次发送?
  • 节点是否可以在任何给定时间崩溃,重新启动并且不发出垃圾?
  • 您是否可以在不停机的情况下向正在运行的群集中添加节点或从中删除节点?
  • 您可以在不停机的情况下升级正在运行的群集中的节点吗?
  • 它可以在异构服务器上正常运行吗?
  • 您可以将队列“粘贴”到一组服务器吗?(例如:“这些队列仅在欧洲数据中心中被允许”)
  • 如果可以的话,是否可以确保将数据副本至少放置在两个数据中心中?

我不幻想任何实现都可以对所有这些说“是”。我只想了解各种实现;他们如何工作,进行了哪些权衡以及也许为什么要决定自己的特定权衡。

另外,如果上面的列表中我可能错过了任何挑战。

Answers:


13

编写基本的排队系统非常简单,但是正如您在上面提到的所有挑战一样,正确地做是另一回事。我使用了自己编写的源代码系统,第三方系统和各种JMS提供程序。到目前为止,JMS(Java消息服务)是我迄今为止遇到的最完整的解决方案。您要求的大部分内容都可以在JMS中获得。我最喜欢的JMS提供程序是ActiveMQ。免费,高性能,易于安装,更重要的是,易于使用Spring嵌入我的应用程序。JMS提供程序并没有提供您所需要的一切,但是它们提供了一套工具来处理您在应用程序需要时提出的许多问题。我还没有发现很多应用程序都需要您列出的所有内容。排序可能并不重要(最好不要排序),

http://activemq.apache.org/what-open-source-integration-solution-works-best-with-activemq-.html

它是否有强命令或丢失命令?是。两者都取决于您的程序需求。详细信息如下:http : //activemq.apache.org/total-ordering.html

它有幂等的位置吗?否,但是在您需要的情况下,在应用程序层中实现这一点很简单。

我们是否可以拥有比一台计算机上容纳的队列更多的队列?是。您可以拥有集群服务器,并且如果您想设置具有不同队列的多台计算机,则可以从任一服务器中拉取。

队列中的数据量是否可以超过一台计算机上容纳的数据量?是的,大多数JMS提供程序必须使用某种类型的数据库/持久性存储,以确保在JMS提供程序发生故障时不会丢失或丢失消息。

在可能丢失数据之前,有多少台计算机可能崩溃? 由于与时间有关,因此很难回答。但是,您可以使JMS提供程序崩溃,并且只要磁盘没有损坏,它就会重新启动并从接收到最后一次提交的位置开始。这意味着消息可能会发送两次,但是如果您对应用进行编码以解决此问题,那不是问题。只要您具有每种类型(生产者,使用者或JMS服务器)中的至少一个,它将完成。如果有磁盘出故障,您也可以进行负载/平衡/故障转移以实现冗余。

它可以容忍网络分裂吗?我想我理解您所说的“网络拆分”的意思,但是我不确定。我猜您的意思是,如果JMS服务器是集群的,并且我们与其中一台服务器的连接松动,它将跳到另一台服务器并从中断的位置开始接管。是的,但是根据客户端丢失连接的时间点,这些类型的情况又可能导致重复消息。

固定网络拆分后,能否自动协调数据?如果您正在使用事务处理会话,它将仅将调用了该提交的所有消息重新传递给运行中的现有客户端。

客户崩溃时能否保证交货?是的,这是JMS的主要目标之一。保证传递意味着如果消息已排队,则保证将由客户端处理。

是否可以保证同一封邮件不会多次发送?是,如果正在使用交易会话。这意味着客户端已经接受了该消息,并称为提交/回滚。一旦提交被调用,它将不会重新传递消息。

节点是否可以在任何给定时间崩溃,重新启动并且不发出垃圾?如果您拥有持久的群集队列。是的,如果集群中的其他节点已传递邮件,则不会发出“垃圾邮件”。它仍然可以重新传送所有未被确认的内容。

您是否可以在不停机的情况下向正在运行的群集中添加节点或从中删除节点? 是。

您可以在不停机的情况下升级正在运行的群集中的节点吗?对于我来说,这有点棘手,但是我相信可以。

它可以在异构服务器上正常运行吗?这到底是什么意思?我发现大多数JMS提供程序都非常容易在使用不同硬件,操作系统等的环境中运行。尽管如果您指的是性能,那完全是另一回事。任何分布式处理系统都可能受到速度较慢的节点的负面影响。我有2台8台核心Intel服务器运行队列和使用者。这是16个核心,与仅添加一个核心计算机作为使用者相比,仅使用这两个工具箱可以获得更好的性能。那台单核计算机的运行速度要慢得多,它使整个网格速度降低了2倍。这与JMS本身无关。

您可以将队列“粘贴”到一组服务器吗?简短的回答是。我可以想出一种方法,您可以在欧洲数据中心中运行一个集群,并在那里配置队列。然后,在spring config中,设置使用者使用该队列以及其他集群上的其他队列。您可能要查阅文档:

http://activemq.apache.org/clustering.html

如果可以的话,是否可以确保将数据副本至少放置在两个数据中心中?我再次相信,但是最好查阅群集文档。

同样,JMS具有许多选项,您可以根据需要进行调整。使用事务处理会话和持久队列会带来性能成本。我已经看到打开所有的钟声会影响性能多达10倍。当我使用JBossMQ时,如果关闭其中的某些功能,则可以得到大约10,000条消息/秒,但是打开它们会使我们降低到1000条消息/秒。大跌。


感谢您抽出宝贵的时间回答这个问题。网络拆分是指群集中的某些节点无法再与其余节点通信。异构服务器我主要是指不同数量的RAM-当服务器外观相似时,某些分布式系统会更喜欢它。
克里斯·韦斯特

那么可以肯定的是,netsplits是。如果使用者掉线或无法沟通,它将继续尝试连接。分配给它的未收到提交的作业将稍后重新分发给其他消费者。如果JMS提供程序出现故障,并且您还有其他集群成员,则可以在整个集群中复制消息,以防止丢失消息。
chubbsondubs 2010年

对于计算机,无论是RAM,硬件还是OS,都没有要求。如果需要,您可以运行混合机器。我唯一关心的是与性能相关的问题,因为不同的机器将以不同的速率处理消息,这可能导致吞吐量降低。但是,JMS模型通过使用拉模型而不是推模型来在某种程度上缓解了这种情况。推模型对这些类型的问题更加敏感。
chubbsondubs 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.