假设您有多个生产者和一个消费者想要从所有可用发布者接收持久消息。
制作人的工作速度不同。假设系统 A 每秒产生 10 个请求,系统 B 每秒产生 1 个请求。因此,如果您使用唯一的队列,您将处理来自 A 的 10 条消息,然后处理来自 B 的 1 条消息。
但是,如果您想要平衡负载并处理来自 A 的一条消息,然后处理来自 B 的一条消息,等等,该怎么办?从多个队列消费不是一个好的选择,因为在这种情况下我们不能使用通配符绑定(bind)。
更新:
每个生产者排队似乎是最好的方法。生产者不知道他们的速度不断变化。每个消费者有一个队列,我可以订阅一个主题并接收来自所有可用发布者的消息。但是每个生产者都有一个队列,我需要自己编写逻辑:
- 通过管理插件获取所有可用队列(AMQP 不允许列出队列)。
- 按队列名称过滤。
- 实现循环策略。
- 实现通知机制来订阅随时可能出现的新发布商。
- 当发布者消失并且客户端读取所有消息时删除不必要的队列。
嗯,这看起来很简单,但我认为代理可以提供所有这些功能,而无需任何编码。如果使用一个队列,我只需创建一个持久队列,将其绑定(bind)到主题交换,然后启动任意数量的发布者将消息发送到该主题。此选项几乎开箱即用。
最佳答案
我知道我参加聚会迟到了,但还是迟到了。
在 Azure 服务总线术语中,它称为“partitioning ”,并且基于分区键。最好的部分是在 Azure SB 中,接收客户端不知道分区,它只是订阅单个队列。
在 RabbitMQ 中,有一个 X-Concient-Hashing 插件(“rabbitmq_consistent_hash_exchange ”),但不幸的是它不是那么方便。消费者必须显式配置为从特定队列消费。如果您有十个队列,那么您需要设置消费者,以便覆盖所有十个队列。
另外两个选项:
请记住,使用分片插件,即使它创建了“一个要消耗的逻辑队列”,您也必须拥有与虚拟队列一样多的订阅者,否则某些队列将未被消耗。
关于java - 如何使用RabbitMQ平衡发布者的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829944/