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

Posted

技术标签:

【中文标题】消息队列、EventBus 和 Pub/Sub 之间的区别?【英文标题】:The difference between a Message Queue, EventBus and a Pub/Sub? 【发布时间】:2014-08-12 00:22:37 【问题描述】:

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

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

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

【问题讨论】:

在Message Queue vs Message Bus主题中完美解释 【参考方案1】:

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

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

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

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

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

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

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

    消息总线: 发布/订阅消息中间件,例如JMS/ActiveMQ 主题,TIBCO RV。消息通过 TCP 或 UDP 发送到另一个进程。更多详情见JMS Topic vs Queues

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

所以,MQ 是一种 IPC 技术。除此之外它们是可互换的?似乎 akka EventBus 也是可分发的。

以上是关于消息队列、EventBus 和 Pub/Sub 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Redis Pub/Sub 发布订阅模式的深度解析与实现消息队列

Eventbus 和 Google Pub/SUb 之间的区别

Redis实现消息队列之发布订阅模式

JMS的P2P和PUB/SUB区别和应用场景介绍

RabbitMQ:在 pub/sub 中,消费者是轮询队列以获取新消息还是服务器推送消息?

消息队列和缓存的区别