消息队列、事件总线和发布/订阅之间的区别是什么?

2022-09-02 04:24:36

我在消息队列(例如ActiveMQ,RabbitMQ,ZeroMQ)和EventBus(例如,Guava Event BusAkka EventBus)的概念之间感到困惑。)

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

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


答案 1

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

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

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

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

如果你把这些放在一起,你就有这些:

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

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

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

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


答案 2

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


推荐