RabbitMq:具有直接绑定的消费者的动态数量
RabbitMq: Dynamic number of consumers with direct bindings
我有以下场景:
- 一个生产者服务
- 消费者服务的动态数量
- 消息包含特定产品的任务,因此一旦消费者 x 处理了产品 y 的消息。未来 x 应该处理产品 y 的所有消息。理想情况下,生产者服务应将产品 x 的所有消息发送到只有消费者 x 读取的队列中。
- 为了平均分配工作量,应该有一种方法,一旦需要管理新产品,下一个可用的消费者就可以使用它。(我想所有消费者都从中读取的队列)
我的做法:
- 交易所在 "newProduct" 队列中发送新产品作业,所有消费者都从该队列中消费。
- 读取此类消息的消费者 y 通知生产者服务(在单独的队列中)他现在负责产品 x。
- 生产者然后将产品 x 的所有消息发送到消费者 y 专有的队列。
- 当一个新的消费者服务 z 上线时,它会通知特定队列上的生产者服务他在线,以便生产者可以在交换中为 z 的适当队列创建绑定。
问题:
- 我的方法是解决问题的好方法吗,还是我缺少可以以不太复杂的方式解决问题的 rabbitmq 解决方案?
- 如何在运行时向交换器添加新队列?
An exchange send new product jobs in a "newProduct" queue to which all
the consumers are consuming from.
这对我来说很不错。
The consumer y that reads such a message notifies to the producer
service (on a separate queue) that he is now in charge of product x.
This is also fine, I guess if producer did not receive notification
that product X is taken care of it will need to do something. The
producer then sends all messages for product x to a queue proper to
consumer y.
我将使用相同的路由密钥发送产品 X 的所有消息,例如 product-X
。这可能就是你在这里的意思。我会避免告诉生产者现在究竟是谁在处理产品 X。为了更好地分离关注点和简化生产者,应该尽可能少地了解消费者及其队列,反之亦然。
When a new consumer service z goes online, it notifies the producer
service on a therefore specific queue that he is online such that the
producer can create a binding in the exchange for z's proper queue.
你可以这样做,但我会用不同的方式来做:
消费者上线后,会自行创建需要的队列(或订阅已有队列)。
我是这样看的:
- 消费者上线并订阅新产品队列。
- 收到消息处理产品Z时:
- 使用绑定键为自己创建一个新队列
product-Z
- 通知生产商现在正在处理产品 Z
- 生产者开始使用路由键
product-Z
发送消息,它们最终进入消费者的队列。
确保您的消费者具有一定的高可用性,否则您可能会遇到这样的情况:您的消费者开始处理一些消息然后死了,而生产者继续为现在未处理的产品发送消息。
我有以下场景:
- 一个生产者服务
- 消费者服务的动态数量
- 消息包含特定产品的任务,因此一旦消费者 x 处理了产品 y 的消息。未来 x 应该处理产品 y 的所有消息。理想情况下,生产者服务应将产品 x 的所有消息发送到只有消费者 x 读取的队列中。
- 为了平均分配工作量,应该有一种方法,一旦需要管理新产品,下一个可用的消费者就可以使用它。(我想所有消费者都从中读取的队列)
我的做法:
- 交易所在 "newProduct" 队列中发送新产品作业,所有消费者都从该队列中消费。
- 读取此类消息的消费者 y 通知生产者服务(在单独的队列中)他现在负责产品 x。
- 生产者然后将产品 x 的所有消息发送到消费者 y 专有的队列。
- 当一个新的消费者服务 z 上线时,它会通知特定队列上的生产者服务他在线,以便生产者可以在交换中为 z 的适当队列创建绑定。
问题:
- 我的方法是解决问题的好方法吗,还是我缺少可以以不太复杂的方式解决问题的 rabbitmq 解决方案?
- 如何在运行时向交换器添加新队列?
An exchange send new product jobs in a "newProduct" queue to which all the consumers are consuming from.
这对我来说很不错。
The consumer y that reads such a message notifies to the producer service (on a separate queue) that he is now in charge of product x. This is also fine, I guess if producer did not receive notification that product X is taken care of it will need to do something. The producer then sends all messages for product x to a queue proper to consumer y.
我将使用相同的路由密钥发送产品 X 的所有消息,例如 product-X
。这可能就是你在这里的意思。我会避免告诉生产者现在究竟是谁在处理产品 X。为了更好地分离关注点和简化生产者,应该尽可能少地了解消费者及其队列,反之亦然。
When a new consumer service z goes online, it notifies the producer service on a therefore specific queue that he is online such that the producer can create a binding in the exchange for z's proper queue.
你可以这样做,但我会用不同的方式来做:
消费者上线后,会自行创建需要的队列(或订阅已有队列)。
我是这样看的:
- 消费者上线并订阅新产品队列。
- 收到消息处理产品Z时:
- 使用绑定键为自己创建一个新队列
product-Z
- 通知生产商现在正在处理产品 Z
- 生产者开始使用路由键
product-Z
发送消息,它们最终进入消费者的队列。
确保您的消费者具有一定的高可用性,否则您可能会遇到这样的情况:您的消费者开始处理一些消息然后死了,而生产者继续为现在未处理的产品发送消息。