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

20
使用 RabbitMQ 发送消息时,您基本上需要有交换机、队列和绑定。我理解它们的概念以及它们之间的关系,但我不太确定谁设置了什么。
基本上,我的应用程序有三种情况。
情况1:一个发布者,多个工作进程 我想要实现的是一个组件将消息发送到队列,然后会有多个工作进程处理该队列中的项目。这对我来说似乎很容易。设置如下:
交换机: 1个类型为'direct'的交换机 队列: 1个队列 绑定: 队列绑定到交换机
每当消息发送到交换机时,它将传递到队列,并且工作进程将获取其任务。
所有内容都应该是持久的。
那么谁设置了什么?在我看来:
生产者创建交换机 生产者创建队列(因为当前可能没有运行任何工作进程,如果没有队列,消息将丢失) 生产者将队列绑定到交换机 消费者只需监听队列
情况2:一个发布者,多个订阅者,易失性消息 第二种情况非常不同。基本上,这是一种发布/订阅场景,其中每条消息都发送到当前所有正在侦听的客户端。如果客户端脱机,则不再接收消息,并且它们也不会存储在任何地方。这意味着以下设置:
交换机: 1个类型为'fanout'的交换机 队列: n个队列,每个消费者一个 绑定: 每个队列都需要绑定到交换机
那么谁设置了什么?在我看来:
生产者创建交换机 消费者创建队列(因为它是自己的队列,生产者无法知道谁对消息感兴趣) 消费者为其队列创建绑定 消费者监听其队列

对吗?

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

基本上和场景2差不多,但是如果消费者离线了,消息不应该丢失。在我看来,这不应该改变任何事情 - 对吗?


有第三个人物可以进行设置:外部管理员。请参阅另一个问题的答案以获取更多信息:https://dev59.com/8W025IYBdhLWcg3wNTAV#6155733 - Brian Kelly
我没有明确地写过那个,但系统应该是自包含的,不需要外部管理员。 - Golo Roden
1个回答

8

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

如果消息在消费者离线时不应该丢失,则需要持久化队列,而队列不能自动删除。

其他方面都没问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接