Message Queue,EventBus和Pub / Sub之间的区别?

时间:2014-06-21 10:58:56

标签: java jms message-queue

我对Message Queue(例如,ActiveMQ,RabbitMQ,ZeroMQ)和EventBus(例如Guava Event BusAkka EventBus

的概念感到困惑。

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

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

3 个答案:

答案 0 :(得分:4)

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

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

队列是消息的一对一目标。该消息仅由一个使用方的接收方接收(请注意:始终将订户用于“主题客户端”,而将接收方始终用于“队列客户端”,以避免混淆)。发送到队列的消息会存储在磁盘或内存中,直到有人捡起来或过期为止。

公共汽车是一对多的分配模型。该模型中的目的地通常称为主题或主题。所有消费订户都收到相同的已发布消息。您也可以将其称为“广播”模型。您可以将主题视为与分布式计算的Observer设计模式中的Subject等效。一些消息总线提供商有效地选择将其实现为UDP而不是TCP。对于主题而言,消息传递是“一劳永逸”的-如果没人听,消息就会消失。如果那不是您想要的,则可以使用“持久订阅”。

如果将所有这些放在一起,那么您将拥有这些:

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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