消息队列与消息总线 - 有什么区别?

Ant*_*lev 80 message-queue message-bus

还有吗?对我来说,MB知道订阅者和发布者,并充当调解者,通知订阅者新消息(实际上是"推送"模型).另一方面,MQ更像是一种"拉"模型,消费者将消息从队列中拉出来.

我完全偏离了这里吗?

vij*_*jay 99

消息总线

消息总线是一个消息传递基础结构,以允许不同的系统来通过通信共享组接口(消息总线).

在此输入图像描述

资料来源:EIP

消息队列

消息队列的基本思想很简单:

  • 两个(或更多)进程可以通过访问公共系统消息队列来交换信息.

  • 发送过程通过一些(OS)消息传递模块将消息放入队列,该队列可由另一个进程读取

资料来源:戴夫马歇尔

在此输入图像描述

图像来源

区别

消息队列中包含的FIFO(先入先出)规则,而在消息总线没有.

结论

这两种LOOK喜欢做同一种工作-两者之间传递消息的应用程序 模块 接口 系统 过程,除了差异小FIFO

  • 您通常在从某处获取文本和图像时添加信用.我添加了消息来源. (16认同)
  • 不一定是真的,有些队列可以让你跳过消息.虽然一般来说这是区分两者的一种非常好的方法. (3认同)

sdg*_*sdg 38

总的来说,当涉及到供应商软件产品时,它们可以互换使用,并且在你所描述的推送或拉动方面没有明显的区别.

总线队列确实有些遗留的概念,最近从像IBM MQ和Tibco集合系统而产生.MQ最初是一个1:1系统,实际上是一个解耦各种系统的队列.

相比之下,Tibco是(作为一个销售的)消息传递主干,您可以在同一主题上拥有多个发布者和订阅者.

然而,这些天(和更新的竞争产品)可以在彼此的空间中发挥作用.两者都可以设置为中断以及轮询新消息.两者都调解各种系统之间的相互作用.

然而,短语消息队列也用于内部线程内消息泵等,并且在这种情况下,使用确实不同.如果你想到经典的Windows消息泵,这确实更像你描述的拉模型,但它实际上比应用程序间或机器间内更多.


小智 20

这两个概念之间的界限有些模糊,因为一些产品现在支持以前仅属于一个或另一个类别的功能(例如Azure Service Bus支持这两种方法).

队列

消息队列从应用程序接收消息,并以先进先出(FIFO)方式将它们提供给一个或多个其他应用程序.在许多架构场景中,如果应用程序A需要向应用程序B和C发送更新或命令,则可以为B和C设置单独的消息队列.A将向每个队列写入单独的消息,并且每个从属应用程序将从其中读取自己的队列(消息在被出列时被删除).为了让A发送更新,B和C都不需要可用.每个消息队列都是持久的,因此如果应用程序重新启动,它将在重新联机后开始从其队列中拉出.这有助于破坏依赖系统之间的依赖关系,并可为应用程序提供更高的可伸缩性和容错能力.

总线

消息总线或服务总线为一个(或多个)应用程序提供了一种将消息传递给一个或多个其他应用程序的方法.可能无法保证先进先出的订购,并且总线的订户可以在不知道消息发送者的情况下来来往往.因此,可以编写应用程序A以通过消息总线将状态更新传送给应用程序B. 稍后,编写的应用程序C也可以从这些更新中受益.应用程序C可以配置为侦听消息总线并根据这些更新采取操作,而无需对应用程序A进行任何更新.与队列不同,发送应用程序显式向每个队列添加消息,消息总线使用发布/订阅模型.消息将发布到总线,任何已订阅此类消息的应用程序都将收到该消息.这种方法允许应用程序遵循开放/封闭原则,因为它们对未来的变化开放,同时保持对其他修改的关闭.

资源


Mat*_*att 11

在其他答案中没有明确提到的主要区别是消息总线允许多个订户,而队列将逐项将项目出列到监听队列的任何内容.如果您希望多个侦听器看到队列中的相同项目,您必须自己处理,服务总线将为您开箱即用.

  • 至少现在不完全正确。Amazon SQS 等服务允许多个读者阅读同一条消息。“隐形”的时间是可配置的。许多队列系统都具有此类功能 - 以及重试和死信队列。 (4认同)
  • @Tom OP 没有提到任何具体产品,所以我认为他正在尝试理解术语和概念 - 为此,我发现这个答案是有用且真实的;即使供应商确实基于这两个概念创建“混合”产品,我认为该术语仍然有效且有用。 (4认同)

Axe*_*ehl 6

消息总线是一对多的分发模型。该模型中的目的地通常称为主题或主题。所有消费订阅者都会收到相同的已发布消息。您也可以将其称为“广播”模型。您可以将主题视为相当于分布式计算的观察者设计模式中的主题。一些消息总线提供商有效地选择将其实现为 UDP 而不是 TCP。对于主题来说,消息传递是“一劳永逸”的——如果没有人听,消息就会消失。如果这不是您想要的,您可以使用“持久订阅”。

消息队列是一对一的消息目的地。该消息仅由其中一个消费接收者接收(请注意:一致使用“主题客户端”的订阅者和“队列客户端”的接收者可以避免混淆)。发送到队列的消息将存储在磁盘或内存中,直到有人拿起它或它过期。因此队列(和持久订阅)需要一些主动的存储管理,您需要考虑缓慢的消费者。

我认为,在大多数环境中,主题是更好的选择,因为您始终可以添加其他组件,而无需更改架构。添加的组件可以是监控、日志记录、分析等。在项目开始时你永远不知道 1 年、5 年、10 年后的需求会是什么样。改变是不可避免的,拥抱它:-)