有吗?对我来说,MB 了解订阅者和发布者,并充当调解者,通知订阅者有新消息(实际上是“推送”模型)。另一方面,MQ 更像是一种“拉”模型,消费者从队列中拉出消息。
我在这里完全偏离轨道了吗?
有吗?对我来说,MB 了解订阅者和发布者,并充当调解者,通知订阅者有新消息(实际上是“推送”模型)。另一方面,MQ 更像是一种“拉”模型,消费者从队列中拉出消息。
我在这里完全偏离轨道了吗?
消息总线
消息总线是一种消息传递基础设施,允许不同系统通过一组共享的接口(消息总线)进行通信。
资料来源:EIP
消息队列
消息队列的基本思想很简单:
两个(或更多)进程可以通过访问公共系统消息队列来交换信息。
发送进程通过一些(OS)消息传递模块将消息放入队列中,该队列可由另一个进程读取
资料来源:戴夫·马歇尔
区别
Message Queue包含FIFO(先进先出)规则,而在Message Bus中则没有。
结论
两者看起来都像在两个应用程序 或 模块 或 接口 或 系统 或 进程之间进行相同类型的工作传递消息,除了FIFO的微小差异
总的来说,当涉及到供应商软件产品时,它们可以互换使用,并且在您描述的推或拉方面没有明显的区别。
BUS与QUEUE确实在某种程度上是一个遗留概念,最近源于 IBM MQ 和 Tibco Rendezvous 等系统。MQ 原本是一个 1:1 的系统,确实是一个解耦各个系统的队列。
相比之下,Tibco 是(作为一个)消息传递主干,您可以在同一主题上拥有多个发布者和订阅者。
然而,如今两者(以及较新的竞争产品)都可以在彼此的空间中发挥作用。两者都可以设置为中断以及轮询新消息。两者都调解各种系统之间的相互作用。
但是message-queue这个短语也用于内部线程内消息泵等,在这种情况下,用法确实有所不同。如果你想到经典的 Windows 消息泵,这确实更像是你描述的拉模型,但它确实更像是应用内而不是应用间或盒子间。
这两个概念之间的界限有些模糊,因为一些产品现在支持以前只属于一个或另一个类别的功能(例如 Azure 服务总线支持这两种方法)。
消息队列从应用程序接收消息,并以先进先出 (FIFO) 的方式将它们提供给一个或多个其他应用程序。在许多架构场景中,如果应用程序 A 需要向应用程序 B 和 C 发送更新或命令,则可以为 B 和 C 设置单独的消息队列。A 会将单独的消息写入每个队列,每个依赖的应用程序将从其读取自己的队列(消息在出队时被删除)。为了让 A 发送更新,B 和 C 都不需要可用。每个消息队列都是持久的,因此如果应用程序重新启动,一旦重新联机,它将开始从其队列中拉取。这有助于打破依赖系统之间的依赖关系,并可以为应用程序提供更大的可扩展性和容错性。
消息总线或服务总线为一个(或多个)应用程序提供一种将消息传递给一个或多个其他应用程序的方式。可能无法保证先进先出的顺序,并且总线的订阅者可以在消息发送者不知情的情况下进出。因此,可以编写应用程序 A 以通过消息总线将状态更新传递给应用程序 B。稍后,编写的应用程序 C 也可以从这些更新中受益。应用程序 C 可以配置为监听消息总线并根据这些更新采取行动,而不需要对应用程序 A 进行任何更新。与队列不同,发送应用程序显式将消息添加到每个队列,消息总线使用发布/订阅模型。消息被发布到总线上,任何订阅了这种消息的应用程序都会收到它。
在其他答案中没有真正明确提到的主要区别是消息总线允许多个订阅者,而队列会将项目一个接一个地出列到任何侦听队列的对象。如果您希望多个侦听器看到相同的项目从队列中出来,您必须自己处理,服务总线会为您开箱即用。
我看到它的方式是Message Queue 创建了 Message Bus。客户端(即节点)然后可以监听消息总线。对于您有一个通过 UDP 广播消息的 MQ 的情况尤其如此,换句话说,它将消息发送到广播/多播地址而不知道或关心谁将获得它们。有关此场景的更深入描述,您可以查看这篇文章。
消息总线是一种一对多的分发模型。此模型中的目的地通常称为主题或主题。所有消费订阅者都会收到相同的发布消息。您也可以将其称为“广播”模型。您可以将主题视为分布式计算的观察者设计模式中的主题等价物。一些消息总线提供者有效地选择将其实现为 UDP 而不是 TCP。对于主题,消息传递是“即发即弃”——如果没有人听,消息就会消失。如果这不是您想要的,您可以使用“持久订阅”。
消息队列是消息的一对一目的地。该消息仅由一个消费接收者接收(请注意:始终将订阅者用于“主题客户端”,将接收者用于队列客户端可避免混淆)。发送到队列的消息存储在磁盘或内存中,直到有人取走它或它过期。所以队列(和持久订阅)需要一些主动的存储管理,你需要考虑慢消费者。
在大多数环境中,我认为主题是更好的选择,因为您始终可以添加其他组件而无需更改架构。添加的组件可能是监控、日志记录、分析等。在项目开始时,您永远不知道 1 年、5 年、10 年的需求会是什么样。改变是不可避免的,拥抱它:-)
服务总线是比消息队列更通用的术语。
MQ 是一个简单的 FIFO,但有更复杂的方法来实现服务总线,即事件中心,它是处理消息的巨大“中心”。除了 MQ 提供的功能之外,它还允许存储消息(因此使用多个订阅者)等