提问者:小点点

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


我有以下场景:

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

我的方法:

  • exchange发送“NewProduct”队列中的新产品作业,所有使用者都从该队列消费。
  • 读取这样一条消息的使用者y通知生产者服务(在一个单独的队列上),他现在负责产品X。
  • 然后,生产者将产品x的所有消息发送到使用者Y的队列。
  • 当新的使用者服务z联机时,它通知特定队列上的生产者服务他联机了,这样生产者就可以在交换中为z的正确队列创建绑定。

问题:

  • 我的方法是解决问题的好方法吗,还是我缺少了rabbitmq解决方案,它可以以不那么复杂的方式解决问题?
  • 如何在运行时向exchange添加新队列?

共1个答案

匿名用户

交换发送“NewProduct”队列中的新产品作业,所有使用者都从该队列中消费。

我觉得这个不错。

读取这样一条消息的消费者y通知生产者服务(在一个单独的队列上)他现在负责产品X。这也是好的,我猜如果生产者没有收到通知,产品X被照顾,它将需要做一些事情。然后,生产者将产品x的所有消息发送到消费者Y的队列。

我将使用相同的路由密钥发送产品X的所有消息,如product-x。你大概就是这个意思。我会避免告诉producer现在是谁来具体处理产品-X的。为了更好地分离关注点和简单性,生产者应该尽可能少地了解消费者及其队列,反之亦然。

当一个新的消费者服务z上线时,它会通知特定队列上的生产者服务他在线了,这样生产者就可以在交换中为z的正确队列创建绑定。

你可以这样做,但我会用不同的方法:

当consumer上线时,它将自己创建所需队列(或订阅现有队列)。

我是这样看的:

  • 使用者联机并订阅newProduct队列。
  • 当收到处理产品Z的消息时:
  • 使用绑定密钥product-z
  • 为自身创建一个新队列
  • 通知生产者产品Z正在处理
  • 生产者开始发送具有路由密钥product-z的消息,这些消息最终进入使用者的队列。

请确保您的消费者具有一些高可用性,否则您可能会出现这样的情况:消费者开始处理某些消息,然后就死了,而producer则继续为现在未处理的产品发送消息。

相关问题