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

3vpjnl9f  于 2023-10-20  发布在  RabbitMQ
关注(0)|答案(2)|浏览(166)

我有多个生产者,他们生产处理组件的请求。有很多这样的组件,每个组件的处理都需要大量的时间。
问题是每个组件一次最多只能运行一个处理任务。换句话说,没有两个任务可以同时在一个组件上运行,但是不同的组件可以(也应该)并行处理。
我的想法是为每个组件创建单独的队列,并让所有工作者订阅所有这些队列。消息代理将只从任何队列发出一条消息并等待ACK。通过这种方式,我可以确保多个组件可以同时处理,但是对于给定的组件,只会发生一个处理任务。
我的问题是:可能吗?如果是的话,这是一个好的方法吗?也许有另一个解决这个问题的方法?
下面是我的方法的图表:

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

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

aydmsdu9

aydmsdu91#

每个组件使用一个队列是可能的(IMO,这是一个好主意)。我不认为它会很好地为一个队列(您编辑的问题)。
细节决定成败,这取决于你使用什么样的浏览系统。

csbfibhn

csbfibhn2#

不要将组件视为队列,而应将其视为主题。当一个worker想要监听特定的组件时,它可以创建一个独占队列,这个队列根据主题(可能是组件名或其他唯一的id)绑定到您的主题交换。
您必须意识到,发布到没有消费者的主题的消息将被删除,因此通过mandatory标志或使用Alternate Exchange来考虑这一点

相关问题