消息队列,EventBus和发布/订阅之间的区别?

wen*_*ner 5 java jms message-queue

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

我认为MQ和eventBus都使用发布/订阅模式。与Guava相比,MQ似乎更强大,更沉重。

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

Axe*_*ehl 13

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

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

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

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

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

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

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

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

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