【发布时间】:2016-12-20 19:01:44
【问题描述】:
对 RabbitMQ 很陌生,我正在尝试使用它来实现我所需要的。
我正在寻找 Worker Queues 模式,但有一个警告。我希望每个路由键只有一个工作人员同时运行。
一个澄清的例子:
如果我按顺序发送以下带有路由键的消息:a、a、b、c,我希望只有 3 个工作人员同时运行。当收到第一条a 消息时,工作人员会捡起它并处理它。
当接收到下一个a 消息并且前一个a 消息仍在处理(未确认)时,新的a 消息应该在队列中等待。当收到b 和c 消息时,它们各自都有一个工作人员处理它们。当第一条a 消息被确认后,任何工作人员都可以接收下一条a 消息。
以自然的方式使用 RabbitMQ 是否可以实现该模式(无需在我这边编写任何应用程序代码来处理锁定和其他东西......)
编辑:
另一个澄清。所有工作人员都可以并且应该处理所有消息,并且我不希望每个工作人员都有一个队列,因为我想在他们之间分担负载,并且发布者不知道哪个工作人员应该处理消息。但我确实想确保没有 2 个 Worker 同时处理共享相同密钥的消息。
例如,如果我有一个发布者发布带有 userId 字段的消息,我想确保没有 2 个 Worker 正在同时处理具有相同 userId 的消息。
编辑 2
扩展userId 示例。假设我有一个发布者和 3 个工人。发布者发布如下消息:{ userId: 1, text: 'Hello' },不同的userIds。我的 3 个工作人员都对这些消息做同样的事情,所以我可以让他们中的任何一个处理进来的消息。但我想要实现的是只有一个工作人员同时处理来自某个用户的消息时间。如果一个 Worker 收到一条带有 userId 1 的消息并且仍在处理它,并且收到另一条带有 userId 1 的消息,我想确保没有其他 Worker 接收到该消息。但是其他带有不同userIds 的消息应该由其他可用的Worker 处理。
userIds 事先不知道,发布者不知道有多少工作人员或关于他们的任何具体信息,他只是想安排消息进行处理。
【问题讨论】:
标签: multithreading rabbitmq message-queue rabbitmq-exchange