RabbitMQ:交换、队列和绑定——谁来设置啥?

Posted

技术标签:

【中文标题】RabbitMQ:交换、队列和绑定——谁来设置啥?【英文标题】:RabbitMQ: Exchanges, queues and bindings - who does setup what?RabbitMQ:交换、队列和绑定——谁来设置什么? 【发布时间】:2012-09-17 19:12:18 【问题描述】:

当使用 RabbitMQ 发送消息时,您基本上有交换、队列和绑定。我已经了解他们的想法以及它们之间的关系,但我不太确定谁设置了什么。

基本上,我的应用程序中有三个场景。

场景 1:一个发布者,多个工作进程

我想要实现的是一个向队列发送消息的组件,并且应该有几个工作进程来处理该队列中的项目。这对我来说似乎很容易。设置如下:

交换:1 次“直接”类型的交换 队列:1 个队列 绑定:队列绑定到交换机

每当一条消息被发送到交换器时,它就会被传递到队列中,并且工作进程会得到它们的任务。

一切都应该是耐用的。

那么谁设置了什么?在我看来:

生产者创建交换 生产者创建队列(因为当前可能没有工作进程在运行,否则如果没有队列,消息会丢失) 生产者将队列绑定到交换器 消费者只需在队列中收听

对吗?

场景 2:一个发布者,多个订阅者,易失性消息

第二种情况完全不同。基本上,这是一个 pub / sub 场景,其中每条消息都发送到每个当前正在侦听的客户端。如果客户端离线,它不再接收消息,并且它们不会存储在任何地方。这意味着以下设置:

交换:1 个类型为“扇出”的交换 队列:n 个队列,每个消费者一个队列 绑定:每个队列都需要绑定到交换机

那么谁设置了什么?在我看来:

生产者创建交换 消费者创建队列(因为它是自己的队列,生产者无法知道谁对消息感兴趣) 消费者为其队列创建与交换的绑定 消费者监听其队列

对吗?

场景 3:一个发布者,多个订阅者,持久消息

与场景 2 基本相同,但如果消费者下线,消息不应丢失。在我看来,这不应该改变任何东西 - 对吧?

【问题讨论】:

还有第三个角色可以进行设置:外部管理员。有关更多信息,请参阅另一个问题的答案:***.com/questions/6148381/… 我没有明确写,但是系统应该是独立的,不需要外部管理员。 【参考方案1】:

我认为你说的是​​对的,除了场景 3。

如果消费者离线时消息不应该丢失,那么您需要持久队列并且队列不能被自动删除。

我觉得其他的一切都是对的。

在场景 2 的情况下,您还可以让 RabbitMQ 为您自动生成队列名称,然后让这些队列在消费者断开连接后自动删除。

【讨论】:

以上是关于RabbitMQ:交换、队列和绑定——谁来设置啥?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMq工作模式

何时使用 RabbitMQ 声明/绑定队列和交换

利用rabbitMq的死信队列实现延时消息

RabbitMQ的动态创建交换机、队列、绑定、死信队列,延迟队列代码实现

RabbitMQ系列队列绑定交换器

使用代码创建rabbitmq交换机和队列绑定