【问题标题】:How to process only one message of given type at a time?如何一次只处理一条给定类型的消息?
【发布时间】:2018-12-08 09:17:18
【问题描述】:

我有多个生产者产生处理组件的请求。这些组件很多,处理每个组件都需要大量时间。

问题是每个组件一次最多只能有一个处理任务。换句话说,没有两个任务可以同时在一个组件上运行,但不同的组件可以(并且应该)并行处理。

我的想法是为每个组件创建单独的队列,并让所有工作人员订阅所有这些队列。消息代理将只从任何队列发出一条消息并等待 ACK。这样我就可以确保可以同时处理多个组件,但对于给定组件只会执行一个处理任务。

我的问题是:这可能吗?如果是的话——这是一个好方法吗?也许这个问题还有其他解决方案?

这是我的方法的示意图:

+----------+              +-------------+
| producer | -----------> |  Exchange   |
+----------+              +-------------+
                           |     |     |
                           v     v     v
                          +-+   +-+   +-+
                          |-|   |-|   |-|
                          |-|   |-|   |-|  Queues per component
                          |-|   |-|   |-|
                          +-+   +-+   +-+
                           |     |     |
                           +-----+-----+
                          /             \
                         v               v
                  +------------+   +------------+
                  | Consumer 1 |   | Consumer 2 |
                  +------------+   +------------+

编辑 — 可以只用一个队列解决吗?在考虑组件数量(基本上是无限的)之前,每个组件有单独队列的想法听起来不错。

【问题讨论】:

    标签: rabbitmq message-queue messaging amqp


    【解决方案1】:

    可以(也是一个好主意,IMO)为每个组件使用一个队列。我认为它不适用于一个队列(您编辑的问题)。

    魔鬼在细节中,而这些取决于您使用的排队系统。

    【讨论】:

      【解决方案2】:

      不要将组件视为队列,而是将它们视为主题。当工作人员想要监听特定组件时,它可以创建一个独占队列,该队列基于主题(可能是组件名称或其他唯一 ID)绑定到您的主题交换。

      您必须注意,发布到没有消费者的主题的消息将被丢弃,因此请通过mandatory 标志或使用Alternate Exchange 考虑这一点


      RabbitMQ 团队会监控 the rabbitmq-users mailing list,并且有时只回答 StackOverflow 上的问题。

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 2020-08-19
        • 2014-10-23
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多