消息队列、EventBus 和 Pub/Sub 之间的区别?

问题描述 投票:0回答:3

我对消息队列(例如 ActiveMQ、RabbitMQ、ZeroMQ)和 EventBus(例如 Guava Event BusAkka EventBus)的概念感到困惑

我认为MQ和eventBus都使用pub/sub模式。与 Guava 相比,MQ 似乎更强大、更重。

但是真正的区别是什么? EventBus 和 MQ 一样吗?

java jms message-queue
3个回答
26
投票

消息通常用于进程间通信以及在机器之间发送消息。您可以将事件封装在消息中(例如作为 XML 或 JSON)并使用消息传输该事件。 TIBCO RV、JMS、IBM 或 Hornet MQ,...

事件通常用于应用程序内通信。例如,在线程之间进行通信或对 GUI 应用程序中的用户输入做出反应(例如 Swing 事件、Guava 等)。

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

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

如果你把这一切放在一起,你就会得到这些:

  1. 消息队列:基于队列的消息中间件有IBM MQ、JMS/ActiveMQ队列、Hornet MQ

  2. 事件队列:基于队列的编程框架。您可以使用任何实现 Java Queue 接口的类来实现此功能。例如阻塞队列

  3. 消息总线:发布/订阅消息中间件,例如JMS/ActiveMQ 主题、TIBCO RV。消息通过 TCP 或 UDP 发送到另一个进程。有关更多详细信息,请参阅JMS 主题与队列

  4. 事件总线:基于发布/订阅的编程框架。 Guava EventBus,观察者设计模式


0
投票

Guava EventBus 仅适用于单个 jvm 内的事件。它甚至明确指出它不适用于进程间通信。我没有看过 Akka,但我猜它是相似的。另一方面,MQ 专门用于在进程之间发送消息。


0
投票

我在wiki中发现事件总线的正确术语是Event_monitoring,现在我可以理解什么是事件总线了。就像信号系统一样,它们大多数都在一个进程中工作,就像 Guava EventBus 剂量一样。虽然它们可以作为 IPC,但这不是主要目的。

MQ是一个消息系统,大多数都有消息服务器,有点复杂,但授予更多的控制,更多的选项。他们中的一些人还拥有管理工具。

因此,它们是解决不同规模或情况的相同技术。

© www.soinside.com 2019 - 2024. All rights reserved.