【问题标题】:Message Bus vs. Multicast消息总线与多播
【发布时间】:2011-11-15 00:48:50
【问题描述】:

我正在开发一个由多个模块组成的应用程序,并要求它们相互共享信息。示例:发布/订阅场景,其中模块发布一些信息(例如状态变量)并且对特定信息感兴趣的模块获取它。或者是请求/回复场景,感兴趣的模块明确询问信息并得到答复。

我一直在研究不同的消息总线实现,即 D-busØMQRabbitMQQPID(后两者基于AMQP)。然而后来有人指出,与其尝试一些复杂而繁重的消息总线实现,不如我简单地使用多播来解决问题。

缺乏了解多播是否真的可以解决我的问题以及了解两种解决方案的优缺点的经验,我恳请专家帮助我。非常感谢。

【问题讨论】:

  • 您对消息速率、大小、持久性和可靠性有什么要求?
  • @ScottA。大约有 30 个模块需要共享信息。消息率不是很高。它主要是需要与其他模块通信的状态信息,例如当状态发生变化时,或者当模块请求状态变量的值时。可靠性在发布/订阅场景中不是大问题,但在请求/回复场景中。
  • 共享状态下保存了多少信息?对于 Zookeeper,用例是高读取、低写入、相当少量的数据。它不是一个消息传递系统,但它可以被滥用。

标签: multicast message-bus


【解决方案1】:

在大型、大批量生产环境中具有消息总线和多播方面的经验,并与几位经验丰富的网络工程师讨论过这些问题,我可以说你应该避免像瘟疫一样的多播,除非你广播到非常大量节点(数百个)。

如果您要使用多播,您必须了解它是一种不可靠的协议。消息可能会丢失,它们可能会被复制,等等。您需要花费大量时间在多播之上获取可靠性协议(重试、重复检测、重新发送)以使其有用。关于多播指挥机器人坦克的军队测试有一个很好的轶事,我试图找到一个参考......基本上当你向一列坦克发送“右转 90 度,右转 90 度,开火”时他们中的一些人只收到 1 个右转消息,而其他人收到 3 个消息,这是混乱的秘诀。

根据您需要分享的信息类型,有多种选择。

如果他们共享配置信息,请查看 Zookeeper 之类的东西。它可靠、轻便且易于使用。共享状态的最新值始终可用并保持不变。使用消息总线,您仍然需要重新发送协议,以防您的模块因关闭而错过最后一条配置消息。

就消息总线而言,它们可能很复杂。但是,我不一定将 ZeroMQ 归入该类别。它可以模拟消息总线,但它更多的是点对点机制。我没有在生产中使用它,但我用它完成的研究和原型设计非常有利。

另一个选项可能是分布式数据网格,如 Oracle Coherence、GridGain、GigaSpaces 等。同样,这是另一个需要安装和维护的应用程序,因此您的复杂性会增加,但数据网格有很多用途。

另一个 MQ 选项是 HornetMQ。我没有使用过它(我们在内部使用两个商业 MQ,Sonic 和 MQ 系列),但我看到了一些有利的比较。

D-Bus 似乎针对单台机器上的通信进行了优化,如果您正在做点对点、集群或其他类似的事情,FAQ 建议您寻找其他地方。警告:我从未使用过 D-Bus,所以我基本上是在重复我刚刚阅读的信息。

【讨论】:

  • 非常感谢您的有用回复。它主要是模块必须共享的状态信息。我一定会看看 Zookeeper。不幸的是,您提到的其他解决方案不能被视为软件大小是一个问题,因为它必须在内存和 CPU 资源有限的硬件上运行。
  • @JahanzebFarooq Zookeeper 的足迹可能与 HornetMQ 类似。同样,这取决于您交易的是什么。状态信息听起来绝对像是 Zookeeper 用例。如果您正在寻找轻量级的东西,ZeroMQ 也是一个不错的选择,但它需要您在顶部添加一个重新发送协议。需要多少台机器进行通信?
  • 在典型情况下,它都在同一台主机上。但是在更高级的场景中,某个模块需要在不同的主机之间进行通信,主机的数量可能在 10 到 50 之间。
【解决方案2】:

您是否担心数据包/消息被丢弃或丢失?消息总线可以处理或缓解这些问题,而默认情况下多播不会。

【讨论】:

  • 这似乎应该是一条评论。在回答问题之前,请通过 cmets 收集您需要的任何说明。
猜你喜欢
  • 1970-01-01
  • 2011-12-09
  • 2010-09-07
  • 2014-08-25
  • 1970-01-01
  • 2018-07-19
  • 2014-04-06
  • 1970-01-01
  • 2019-12-12
相关资源
最近更新 更多