如何平衡发布商的请求与RabbitMQ?

时间:2015-04-23 16:57:33

标签: java rabbitmq messaging amqp spring-rabbit

假设您有多个生产者和一个消费者希望接收来自所有可用发布者的持久消息。

生产者以不同的速度工作。假设系统A产生10个请求/秒,系统B 1请求/秒。因此,如果您使用唯一的队列,您将处理来自A的10条消息,然后处理来自B的1条消息。

但是如果你想平衡负载并处理来自A的一条消息然后处理来自B等的一条消息怎么办?从多个队列中消费不是一个好的选择,因为在这种情况下我们不能使用通配符绑定。

更新
每个生产者的队列似乎是最好的方法。生产者不知道他们的速度会不断变化。每个消费者拥有一个队列,我可以订阅一个主题并接收来自所有可用发布者的消息。但是每个生产者都有一个队列,我需要自己编写逻辑代码:

  1. 通过管理插件获取所有可用队列(AMQP不允许列出队列)。
  2. 按队列名称过滤。
  3. 实施循环战略。
  4. 实施通知机制以订阅可随时出现的新发布商。
  5. 当发布者消失并且客户端阅读所有消息时删除不必要的队列。
  6. 嗯,看起来很简单,但我认为经纪人可以提供所有这些功能而无需任何编码。如果有一个队列我只创建一个持久队列,将其绑定到主题交换,然后启动任意数量的发送消息到主题的发布者。此选项几乎可以开箱即用。

2 个答案:

答案 0 :(得分:1)

我知道我参加聚会迟到了,但仍然如此。

在 Azure 服务总线术语中,它被称为“partitioning”,它基于分区键。最好的部分是在 Azure SB 中,接收客户端不知道分区,它只是订阅单个队列。

在 RabbitMQ 中有一个 X-Consistent-Hashing 插件 ("rabbitmq_consistent_hash_exchange") 但不幸的是它不是那么方便。消费者必须明确配置为从特定队列消费。如果您有 10 个队列,那么您需要设置您的使用者,以便涵盖所有 10 个队列。

另外两个选项:

  1. Random Exchange Type
  2. Sharding Plugin

请记住,使用 Sharding Plugin,即使它创建了“一个要使用的逻辑队列”,您也必须拥有与虚拟队列一样多的订阅者,否则某些队列将未被使用。

答案 1 :(得分:0)

您可以使用Priority Queue Support并根据生产者速度关联优先级。需要注意的是,必须谨慎设置优先级(例如,如果消费者速度低于系统B,消费者将只消费来自B的消息),生产者必须意识到它们的生产速度。

另一个需要考虑的选择是根据生成速度创建3种类型的队列:HIGHMEDIUMLOW。根据生成速度,将三个队列绑定到交换机,并设置绑定密钥。可以使用。

完成

消费者将使用循环策略消耗来自这3个队列的消息。需要注意的是,生产者必须意识到它们的生产速度。

但最佳选择可能是每个生产者的队列,特别是如果生产者速度不稳定且无法分类。因此,生产者不需要知道他们的生产速度。