【发布时间】:2017-08-17 12:30:22
【问题描述】:
我正在使用 RabbitMQ 的循环功能在多个消费者之间发送消息,但一次只有一个消费者接收实际消息。
我的问题是我的消息代表任务,我希望在我的消费者上拥有本地会话(状态)。我事先知道哪些消息属于哪个会话,但我不知道使用我指定的算法将 RabbitMQ 分派给消费者的最佳方法是什么(或者有没有办法?)。
我不想编写自己的编排服务,因为它会成为瓶颈,我不希望我的生产者知道哪个消费者会接收他们的消息,因为我会失去使用 Rabbit 获得的解耦。
有没有办法让 RabbitMQ 根据预定义的算法/规则而不是循环法将我的消息发送给消费者?
澄清:我使用了几个用不同语言编写的微服务,每个服务都有自己的工作。我使用 protobuf 消息在它们之间进行通信。我给每条新消息一个UUID。如果消费者收到一条消息,它可以从中创建一条响应消息(这可能不是正确的术语,因为生产者和消费者是分离的并且他们彼此不了解) 和 @987654322 @ 被复制到新消息中。这形成了一个数据转换管道,这个“进程”由UUID(processId)标识。我的问题是,我可能有多个工人消费者,如果以前见过UUID,我需要一名工人坚持。我有这个需求是因为
- 每个进程可能都有本地状态
- 进程完成后我要清理本地状态
- 一个微服务可能会收到同一个进程的多条消息,我需要区分哪个消息属于哪个进程
由于 RabbitMQ 使用循环法在工作人员之间分配任务,因此我不能强制我的进程坚持一个工作人员。我有几个警告:
- 生产者与消费者分离,因此不能选择直接消息传递
- 工作人员的数量不是恒定的(有一个负载平衡器可能会启动工作人员的新实例)
如果有一个不涉及更改循环算法并且不违反我的约束的解决方法也可以!
【问题讨论】:
-
您能否详细说明是什么让消息属于特定消费者?
-
查看我的编辑以澄清这一点。