相当新的RabbitMQ,我试图看看我能否实现我所需要的。RabbitMQ - 单个并发工作者每个路由密钥
我正在寻找工作队列模式,但有一个警告。我想只有一个工作者同时运行每个路由键。
澄清一个例子:
如果我的顺序发送具有路由键下面的消息:a
,a
,b
,c
,我想只有3个工人同时运行。当收到第一个a
消息时,工作人员将其拿起并处理。
当收到下一个a
消息并且之前的a
消息仍然处理(未确认)时,新的a
消息应在队列中等待。当接收到b
和c
消息时,他们每个都会得到一个处理它们的工作人员。当第一个a
消息被确认时,任何工人都可以拿起下一个a
消息。
另一个澄清:
会以自然的方式使用RabbitMQ的(不站在我这一边写任何程序代码来处理的锁定和东西...)
编辑模式是可能的。所有员工都可以并且应该处理所有消息,并且我不希望为每个员工设置一个队列,因为我想分担他们之间的负载,而发布者不知道哪个工作人员应该处理消息。但我确实希望确保没有2名工人正在同时处理共享相同密钥的消息。
例如,如果我有一个Publisher发布带有userId
字段的邮件,我想确保没有2个工作人员同时处理具有相同userId
的邮件。
编辑2
扩大上userId
例子。假设我有一个发布者和3个工人。发布者发布如下消息:{ userId: 1, text: 'Hello' }
,其变化范围为userId
s。我的3名工人都对这条消息做了同样的事情,所以我可以让他们中的任何一位处理消息。但是我试图实现的是只有一个工作人员处理来自某个用户的消息时间。如果工作人员收到一条消息,并且正在处理该消息,并且收到另一条消息userId
1,我想确保没有其他工作人员收到该消息。但其他消息与不同的userId
s应该由其他可用的工作人员处理。
userId
s是事先不知道的,发布者不知道有多少员工是他们的具体情况,他只是想要安排消息进行处理。
以我的观点来看,这个计算器是正确的。但是,即使是排队的人也不会,因为问题是“任何工人都可以拿起下一个信息”,这是不可能的。在这种情况下,每个队列只有一个工作人员和一个路由密钥。所以每次同一个工作人员拿起下一条消息。 – slowjack2k
谢谢,Derick,但@ slowjack2k对我的意思是正确的。我给工人的所有信息都是一样的,我不在乎(也不想关心)哪个工作人员收到信息。我只想确保只有一个工作人员根据某个键(我为每条消息生成的)输入一些消息。 –
@NetanelG这两个陈述并不一致'我的所有工作人员的消息都是相同的'和'基于某个键的消息(我为每个消息生成的)'Aslo Derick的答案对于你问过的问题是正确的你问过它,但基于这个评论,我认为你应该编辑它。 – cantSleepNow