Java 如何平衡出版商';使用RabbitMQ的请求?

Java 如何平衡出版商';使用RabbitMQ的请求?,java,rabbitmq,messaging,amqp,spring-rabbit,Java,Rabbitmq,Messaging,Amqp,Spring Rabbit,假设您有多个生产者和一个消费者,希望从所有可用的发布者接收持久消息 制片人以不同的速度工作。假设系统A每秒生成10个请求,系统B每秒生成1个请求。因此,如果您使用唯一的队列,您将处理来自A的10条消息,然后是来自B的1条消息 但是,如果您想平衡负载并处理来自A的一条消息,然后是来自B的一条消息,等等,该怎么办。?从多个队列消费不是一个好的选择,因为在这种情况下我们不能使用通配符绑定 更新: 按生产商排队似乎是最好的方法。制片人不知道他们不断变化的速度。每个消费者有一个队列,我可以订阅一个主题并从

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

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

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

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

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

    您可以使用,并根据生产者速度关联优先级。需要注意的是,必须小心设置优先级(例如,如果使用者速度低于系统B,则使用者将仅使用来自B的消息),并且制作者必须知道其制作速度

    另一个选择是根据生产速度创建3种类型的队列:<代码>高< /代码>,<代码>媒体< /代码>,<代码>低< /代码>。三个队列绑定到交换机,绑定密钥根据生产速度设置。这可以通过使用

    消费者将使用循环策略使用这3个队列中的消息。有一点需要注意,生产商必须意识到他们的生产速度


    但最好的选择可能是每个生产者排队,特别是当生产者的速度不稳定且无法分类时。因此,制作人不需要知道他们的制作速度。

    我知道我参加晚会迟到了,但还是迟到了

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

    在RabbitMQ中有一个X一致性散列插件(“”),但不幸的是,它没有那么方便。消费者必须明确配置为从特定队列消费。如果您有十个队列,那么您需要设置您的消费者,以便覆盖所有十个队列

    另外两个选择:


  • 请记住,使用切分插件,即使它创建了“一个要使用的逻辑队列”,您也必须拥有与虚拟队列一样多的订阅者,否则一些队列将保持未使用状态。

    不清楚您所说的“不能使用通配符绑定”是什么意思-请澄清您的问题,并提供更多详细信息,说明为什么不可能有多个队列。