我对消息队列(例如 ActiveMQ、RabbitMQ、ZeroMQ)和 EventBus(例如 Guava Event Bus、Akka EventBus)的概念感到困惑
我认为MQ和eventBus都使用pub/sub模式。与 Guava 相比,MQ 似乎更强大、更重。
但是真正的区别是什么? EventBus 和 MQ 一样吗?
消息通常用于进程间通信以及在机器之间发送消息。您可以将事件封装在消息中(例如作为 XML 或 JSON)并使用消息传输该事件。 TIBCO RV、JMS、IBM 或 Hornet MQ,...
事件通常用于应用程序内通信。例如,在线程之间进行通信或对 GUI 应用程序中的用户输入做出反应(例如 Swing 事件、Guava 等)。
队列是一对一的消息目的地。该消息仅由其中一个消费接收者接收(请注意:一致使用“主题客户端”的订阅者和“队列客户端”的接收者可以避免混淆)。发送到队列的消息存储在磁盘或内存中,直到有人拿起它或它过期。
A bus 是一对多的分发模型。该模型中的目的地通常称为主题或主题。所有消费订阅者都会收到相同的已发布消息。您也可以将其称为“广播”模型。您可以将主题视为相当于分布式计算的观察者设计模式中的主题。一些消息总线提供商有效地选择将其实现为 UDP 而不是 TCP。对于主题来说,消息传递是“一劳永逸”的——如果没有人听,消息就会消失。如果这不是您想要的,您可以使用“持久订阅”。
如果你把这一切放在一起,你就会得到这些:
消息队列:基于队列的消息中间件有IBM MQ、JMS/ActiveMQ队列、Hornet MQ
事件队列:基于队列的编程框架。您可以使用任何实现 Java Queue 接口的类来实现此功能。例如阻塞队列
消息总线:发布/订阅消息中间件,例如JMS/ActiveMQ 主题、TIBCO RV。消息通过 TCP 或 UDP 发送到另一个进程。有关更多详细信息,请参阅JMS 主题与队列
事件总线:基于发布/订阅的编程框架。 Guava EventBus,观察者设计模式
Guava EventBus 仅适用于单个 jvm 内的事件。它甚至明确指出它不适用于进程间通信。我没有看过 Akka,但我猜它是相似的。另一方面,MQ 专门用于在进程之间发送消息。
我在wiki中发现事件总线的正确术语是Event_monitoring,现在我可以理解什么是事件总线了。就像信号系统一样,它们大多数都在一个进程中工作,就像 Guava EventBus 剂量一样。虽然它们可以作为 IPC,但这不是主要目的。
MQ是一个消息系统,大多数都有消息服务器,有点复杂,但授予更多的控制,更多的选项。他们中的一些人还拥有管理工具。
因此,它们是解决不同规模或情况的相同技术。