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

有吗?对我来说,MB 了解订阅者和发布者,并充当中间人,通知订阅者新消息(实际上是一种“推送”模式)。另一方面,MQ 更像是一种“拉”模型,消费者从队列中拉出消息。

我是不是完全跑题了?

97979 次浏览

总的来说,当涉及到供应商软件产品时,它们是可以互换使用的,并且在推或拉方面没有您所描述的那种强烈的区别。

巴士排队的对决实际上在某种程度上是一个遗留的概念,最近源自于 IBM MQ 和 Tibco Rendetous 这样的系统。MQ 最初是一个1:1系统,实际上是一个用于解耦各种系统的队列。

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

然而,如今这两种产品(以及更新的竞争产品)都可以在对方的领域中发挥作用。两者都可以设置为中断以及轮询新消息。两者都调解不同系统之间的相互作用。

然而,短语 消息队列也用于内部线程内消息泵等,在这种情况下,用法确实不同。如果你想想经典的 Windows 消息泵,这确实更像是你描述的“拉”模型,但是它更像是应用内部的而不是应用间或者盒子间的。

我认为 消息队列创建消息总线。然后,客户机(即节点)可以监听消息总线。对于 MQ 通过 UDP 广播消息的情况尤其如此,换句话说,它将消息发送到广播/多播地址,而不知道或不关心谁将收到这些消息。有关此场景的更深入描述,可以检查 这篇文章

消息总线

消息总线是一种消息传递基础设施,允许不同的系统通过 共享接口集合(消息总线)进行通信。

enter image description here

资料来源: EIP

消息队列

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

  • 两个(或更多)进程可以通过 < strong > 访问 公共系统消息队列 。

  • 发送进程通过某个(OS)消息传递模块放置 消息到一个队列中,该队列可以被另一个进程

  • 读取

资料来源: Dave Marshall

enter image description here

图像来源

区别

消息队列 包含 FIFO(先进先出)规则,而在 消息总线中不包含。

结论

两个 听着都喜欢在两个 申请表 或者 模组 或者 接口 或者 系统 或者 程序之间做同样的工作传递消息,除了 申请表0之间的差别很小

其他答案中没有明确提到的主要区别是,消息总线允许多个订阅者,而队列将一个接一个地将项目出队列到任何正在监听队列的内容。如果您希望多个侦听器看到相同的项从队列中出来,那么您必须自己处理这个问题,服务总线将为您提供开箱即用的服务。

这两个概念之间的界限有些模糊,因为一些产品现在支持以前只属于一个或另一个类别的特性(例如 Azure 服务总线支持这两种方法)。

排队

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

巴士

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

来源

服务总线是一个比消息队列更通用的术语。

MQ 是一个简单的 FIFO,但是有更复杂的方法来实现服务总线,即事件中心,它是操作消息的巨大“中心”。除了 MQ 提供的功能之外,它还允许存储消息(因此使用多个订阅者)等等

消息总线是一个1对多的分布模型。此模型中的目标通常称为主题或主题。所有使用订阅者都会收到相同的已发布消息。你也可以称之为“广播”模型。你可以把一个主题看作是观察者设计模式中的一个分布式计算。一些消息总线提供者有效地选择将其实现为 UDP 而不是 TCP。对于主题的消息传递是“火和忘记”-如果没有人听,消息只是消失。如果这不是你想要的,你可以使用“持久订阅”。

消息队列是消息的1对1目的地。消息只被一个消费接收者接收(请注意: 始终使用订阅者作为主题客户端,使用接收者作为队列客户端,避免混淆)。发送到队列的消息存储在磁盘或内存中,直到有人提取或过期。因此,队列(和持久订阅)需要一些主动存储管理,您需要考虑缓慢的使用者。

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