RabbitMq:具有直接绑定的消费者的动态数量

时间:2019-02-11 17:48:35

标签: rabbitmq messaging messagebroker

我有以下情况:

  • 一个生产者服务
  • 动态数量的消费者服务
  • 消息包含特定产品的任务,因此一旦消费者x处理产品y的消息。将来,x应该处理产品y的所有消息。理想情况下,生产者服务应该在只有消费者x读取的队列上发送产品x的所有消息。
  • 为了平均分配工作量,应该有一种方法,一旦需要管理新产品,下一个可用的消费者就会使用它。(我想所有消费者都从中读取队列)

我的方法:

  • 交换所将新产品作业发送到所有消费者正在使用的“ newProduct”队列中。
  • 读取此类消息的消费者y通知生产者服务(在单独的队列中),他现在负责产品x。
  • 然后,生产者将产品x的所有消息发送到适合于消费者y的队列。
  • 当新的消费者服务z联机时,它会在特定队列上通知生产者服务他处于联机状态,以便生产者可以在交换z的适当队列时创建绑定。

问题:

  • 我的方法是解决问题的一种好方法,还是我缺少能够以更简单的方式解决问题的Rabbitmq解决方案?
  • 如何在运行时向交换添加新队列?

1 个答案:

答案 0 :(得分:1)

  

交易所将新产品作业发送到“ newProduct”队列中,所有   消费者从中消费。

这对我来说很好。

  

读取此类消息的消费者y通知生产者   服务(在单独的队列中),他现在负责产品x。   这也很好,我想生产者是否未收到通知   该产品X已被妥善保管,它将需要做一些事情。的   生产者然后将产品x的所有消息发送到适当的队列   消费者y。

我将使用相同的路由密钥(例如product-X)发送产品X的所有消息。这可能就是您的意思。我会避免告诉生产者现在是谁来正确处理产品X。为了更好地分离关注点和简化操作,生产者应尽可能少地了解消费者及其队列,反之亦然。

  

新的消费者服务z上线时,它将通知生产者   因此在他在线的特定队列上提供服务,以便   生产者可以在交换中为z的适当队列创建绑定。

您可以这样做,但是我会做不同的事情:

消费者在线时,它将自行创建所需的队列(或订阅现有队列)。

我这样看:

  • 消费者在线并订阅newProduct队列。
  • 收到处理产品Z的消息时:
  • 使用绑定键product-Z为自己创建一个新队列
  • 通知生产者正在处理产品Z
  • 生产者开始使用路由密钥product-Z发送消息,并且消息最终出现在“消费者”队列中。

请确保您的使用者具有某些高可用性,否则您可能会遇到这样的情况:当使用者开始处理某些消息然后消失时,生产者将继续为现在未处理的产品发送消息。