如何一次只处理一条给定类型的消息?

问题描述 投票:0回答:2

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

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

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

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

这是我的方法图:

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

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

rabbitmq message-queue messaging amqp
2个回答
0
投票

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

细节决定成败,这取决于您使用的排队系统。


0
投票

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

您必须注意,发布到没有消费者的主题的消息将被删除,因此通过

mandatory
标志考虑到这一点或使用 Alternate Exchange

© www.soinside.com 2019 - 2024. All rights reserved.