【问题标题】:RabbitMq: Dynamic number of consumers with direct bindingsRabbitMq:具有直接绑定的消费者的动态数量
【发布时间】:2019-07-05 06:52:23
【问题描述】:
我有以下场景:
- 一个生产者服务
- 消费者服务的动态数量
- 消息包含特定产品的任务,因此一旦消费者 x 处理产品 y 的消息。将来 x 应该处理产品 y 的所有消息。理想情况下,生产者服务应该将产品 x 的所有消息发送到只有消费者 x 读取的队列中。
- 为了平均分配工作量,应该有一种方法,一旦需要管理新产品,下一个可用的消费者就会接受它。(我假设所有消费者都在读取的队列)
我的做法:
- 交换器在“newProduct”队列中发送新产品作业,所有消费者都从该队列中消费。
- 读取此类消息的消费者 y 通知生产者服务(在单独的队列中)他现在负责产品 x。
- 然后,生产者将产品 x 的所有消息发送到消费者 y 专有的队列。
- 当新的消费者服务 z 上线时,它会通知特定队列上的生产者服务他已上线,以便生产者可以在交换机中为 z 的正确队列创建绑定。
问题:
- 我的方法是解决问题的好方法,还是我错过了能以不太复杂的方式解决问题的 rabbitmq 解决方案?
- 如何在运行时向 Exchange 添加新队列?
【问题讨论】:
标签:
rabbitmq
messaging
messagebroker
【解决方案1】:
交易所在“newProduct”队列中发送新产品作业,所有
消费者正在消费。
这对我来说看起来不错。
读取此类消息的消费者y通知生产者
他现在负责产品 x 的服务(在单独的队列中)。
这也可以,我猜如果生产者没有收到通知
产品 X 得到照顾,它需要做一些事情。这
生产者然后将产品 x 的所有消息发送到适当的队列
消费者y。
我会使用相同的路由密钥发送产品 X 的所有消息,例如 product-X。这就是你可能在这里的意思。我会避免告诉制片人现在究竟是谁在处理产品-X。为了更好地分离关注点和简化生产者应该尽可能少地了解消费者及其队列,反之亦然。
当一个新的消费者服务z上线时,它会通知生产者
因此,他在线的特定队列上的服务,使得
生产者可以在交换中为 z 的正确队列创建绑定。
你可以这样做,但我会这样做:
消费者上线时,会自行创建需要的队列(或订阅现有队列)。
我是这样看的:
- 消费者上线并订阅新产品队列。
- 收到处理产品 Z 的消息时:
- 使用绑定键
product-Z为自己创建一个新队列
- 通知生产商产品 Z 正在处理中
- Producer 开始使用路由键
product-Z 发送消息,最终进入 Consumer 的队列。
确保您的消费者具有一定的高可用性,否则您可能会遇到消费者开始处理一些消息然后死机的情况,而生产者继续为现在未处理的产品发送消息。