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

3
我有多个生成器产生处理组件的请求。这些组件很多,每个组件的处理都需要相当长的时间。
问题在于每个组件最多只能运行一个处理任务。换句话说,在一个组件上不可能同时进行两个任务,但应该可以(并且应该)并行处理不同的组件。
我的想法是为每个组件创建单独的队列,并让所有工作人员订阅所有这些队列。消息代理只会从任何队列中发出一条消息并等待确认。这样,我就可以确保多个组件可以同时处理,但仅针对给定组件的一个处理任务会发生。
我的问题是:这种方法可行吗?如果是,这是一个好的方法吗?也许还有其他解决该问题的方法?
以下是我的方法图解:
+----------+              +-------------+
| producer | -----------> |  Exchange   |
+----------+              +-------------+
                           |     |     |
                           v     v     v
                          +-+   +-+   +-+
                          |-|   |-|   |-|
                          |-|   |-|   |-|  Queues per component
                          |-|   |-|   |-|
                          +-+   +-+   +-+
                           |     |     |
                           +-----+-----+
                          /             \
                         v               v
                  +------------+   +------------+
                  | Consumer 1 |   | Consumer 2 |
                  +------------+   +------------+

编辑 — 只用一个队列就可以解决这个问题吗?按组件分开使用不同的队列听起来很不错,但是考虑到组件数量(基本上是无限的),这个想法就不太可行了。

2个回答

0

每个组件使用一个队列是可能的(而且我认为这是一个好主意)。我不认为一个队列会很适合(你编辑后的问题)。

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


0

不要把组件看作队列,而应该把它们看作主题。当一个工作者想要监听特定的组件时,它可以创建一个专属队列,该队列绑定到您的主题交换机,基于主题(这将是组件名称或其他唯一标识)。

您需要知道,发布到没有消费者的主题的消息将被丢弃,因此请通过mandatory标志进行考虑,或使用备用交换机


RabbitMQ团队监控{{link1:rabbitmq-users邮件列表}},有时会在StackOverflow上回答问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接