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