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

标签 rabbitmq message-queue publish-subscribe

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

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

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

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

  • 交换:1 次“直接”类型交换
  • 队列:1个队列
  • 绑定(bind):队列绑定(bind)到交易所

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

    一切都将是耐用的。

    那么谁设置了什么?在我看来:
  • 制作人创汇
  • 生产者创建队列(因为当前可能没有工作进程在运行,否则如果没有队列,消息会丢失)
  • 生产者将队列绑定(bind)到交换
  • 消费者只需在队列中收听

  • 对?

    场景 2:一个发布者,多个订阅者, volatile 消息

    第二种情况完全不同。基本上,这是一个 pub/sub 场景,其中每条消息都发送到每个当前正在监听的客户端。如果客户端离线,它将不再接收消息,并且它们不会为他存储在任何地方。这意味着以下设置:
  • 交换:1 次交换类型为“扇出”
  • 队列:n个队列,每个消费者一个
  • 绑定(bind):每个队列都需要绑定(bind)到exchange

  • 那么谁设置了什么?在我看来:
  • 制作人创汇
  • 消费者创建队列(因为它是自己的队列,生产者无法知道谁对消息感兴趣)
  • 消费者为其队列创建与交换的绑定(bind)
  • 消费者监听其队列

  • 对?

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

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

    最佳答案

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

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

    其他一切对我来说似乎都是正确的。

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

    关于RabbitMQ:交换、队列和绑定(bind)——谁来设置什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12597006/

    相关文章:

    c# - 如何在纯 C# 中制作队列消息代理

    wcf - 保持 wcf 回调 channel 无限期打开/如果出现故障则从客户端重新连接

    java - SpringBoot RabbitMq解析盒子的json消息auto

    php - 如何使用 PHP 从 rabbitMq 队列中获取单个消息?

    python - 我应该在 Django 项目中使用 Celery 还是 Carrot?

    c++ - C++ 中的 MSMQ 示例?

    delphi - Windows服务中的定时器队列

    rabbitmq - 使用独占 + 持久队列,用于 RabbitMQ

    node.js - 工作人员可以向生产者发送消息吗

    model-view-controller - 观察者、发布/订阅和数据绑定(bind)之间的区别