我有多个生产者,它们产生处理组件的请求。这些组件有很多,每一个组件的处理都需要大量时间。
问题是每个组件一次最多只能运行一个处理任务。换句话说,没有两个任务可以在一个组件上同时运行,但不同的组件可以(并且应该)并行处理。
我的想法是为每个组件创建单独的队列,并让所有工作人员订阅所有这些队列。消息代理只会从任何队列中发出一条消息并等待 ACK。这样我将确保可以同时处理多个组件,但给定组件只会执行一个处理任务。
我的问题是:可能吗?如果是的话——这是一个好方法吗?也许这个问题还有另一种解决方案?
这是我的方法图:
+----------+ +-------------+
| producer | -----------> | Exchange |
+----------+ +-------------+
| | |
v v v
+-+ +-+ +-+
|-| |-| |-|
|-| |-| |-| Queues per component
|-| |-| |-|
+-+ +-+ +-+
| | |
+-----+-----+
/ \
v v
+------------+ +------------+
| Consumer 1 | | Consumer 2 |
+------------+ +------------+
编辑 — 仅用一个队列就能解决吗?在考虑组件数量(基本上是无限的)之前,每个组件都有单独队列的想法听起来不错。
可以(在我看来,这是一个好主意)每个组件使用一个队列。我认为它不适用于一个队列(您编辑的问题)。
细节决定成败,这取决于您使用的排队系统。
不要将组件视为队列,而应将它们视为主题。当工作人员想要侦听特定组件时,它可以根据主题(可以是组件名称或其他唯一 ID)创建绑定到您的主题交换的独占队列。
您必须注意,发布到没有消费者的主题的消息将被删除,因此通过
mandatory
标志考虑到这一点或使用 Alternate Exchange