RabbitMQ:交换,队列和绑定 - 谁设置了什么?

时间:2012-09-26 07:51:09

标签: rabbitmq message-queue publish-subscribe

当使用RabbitMQ发送消息时,您基本上有交换,队列和绑定。我已经理解了他们的想法以及他们如何相互联系,但我不确定是谁设置了什么。

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

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

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

  • 交换:1与表格'直接'
  • 交换
  • 队列:1个队列
  • 绑定:队列绑定到交换

每当消息被发送到交换机时,它就会被传递到队列,并且工作进程会完成它们的任务。

一切都应该持久。

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

  • 制作人创建交流
  • 生产者创建队列(因为当前可能没有正在运行的工作进程,如果没有队列,则消息将丢失)
  • 生产者将队列绑定到交换
  • 消费者只需听队列

右?

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

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

  • 兑换:1次与类型'粉丝'
  • 交换
  • 队列:n个队列,每个消费者一个
  • 绑定:每个队列都需要绑定到交换
那么谁设置了什么?在我看来:

  • 制作人创建交流
  • Consumer创建队列(因为它是自己的队列,生产者无法知道谁对这些消息感兴趣)
  • Consumer为其队列创建绑定到交换
  • Consumer侦听其队列

右?

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

基本上与方案2相同,但如果消费者离线,则不应丢失消息。在我看来,这不应该改变任何事情 - 对吧?

1 个答案:

答案 0 :(得分:6)

我认为你说的是​​正确的,除了情景3。

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

其他一切似乎都适合我。

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