RabbitMQ:从队列为多个使用者分派固定消息

RabbitMQ:从队列为多个使用者分派固定消息,rabbitmq,spring-amqp,Rabbitmq,Spring Amqp,是否有一种方法可以限制RabbitMQ队列仅从队列向使用者发送固定数量的消息 我有两个队列Q1和Q2以及10个消费者。每个消费者都可以处理来自Q1和Q2的消息。在任何给定时间,只有2个消费者应该处理来自Q2的消息。所有10个消费者都可以同时处理来自Q1的消息 RabbitMQ中是否有任何我们可以指定的配置,以便RabbitMQ仅将2条消息从Q2推送到任何空闲消费者,并仅在确认后推送到下2条消息,即使其他消费者是空闲的并准备好消费 关于这个问题的更多背景: 为什么一次只处理两条消息 Q2消息正在执

是否有一种方法可以限制RabbitMQ队列仅从队列向使用者发送固定数量的消息

我有两个队列Q1和Q2以及10个消费者。每个消费者都可以处理来自Q1和Q2的消息。在任何给定时间,只有2个消费者应该处理来自Q2的消息。所有10个消费者都可以同时处理来自Q1的消息

RabbitMQ中是否有任何我们可以指定的配置,以便RabbitMQ仅将2条消息从Q2推送到任何空闲消费者,并仅在确认后推送到下2条消息,即使其他消费者是空闲的并准备好消费

关于这个问题的更多背景:

为什么一次只处理两条消息 Q2消息正在执行web服务调用,web服务端点(第三方)只能同时为2条消息提供服务

我们不能使用并发吗 如果我们使用ListenerContainer(Spring AMQP),则该容器是每个消费者的。我们可以限制一个消费者一次可以接收多少消息,但是当我们有10个消费者时,如果队列中有消息,每个消费者将获得其份额

我们能否仅配置2个收听第2季度的消费者 我知道我们可以通过为第2季度配置2个消费者来实现这一点,但我正试图避免这种情况。如果由于某种原因这两个耗电元件下降,第二季度的处理将停止。如果配置了10个耗电元件,我们可以保证在最后一个耗电元件停机之前,处理将一直进行

查看RabbitMQ中是否有我们可以使用的配置或任何建议的解决方案

提前谢谢

我很肯定这会实现你想要的。但是,Q2只能有一个消费者才能使其工作。没有办法在多个使用者之间进行协调-您必须自己进行协调,并且可以使用RabbitMQ进行协调



注意:RabbitMQ团队监控
RabbitMQ用户
,有时只回答有关StackOverflow的问题。

我认为您已经被问题定义所包围。你真正需要的是琐碎的东西,所以让我们把它分解一下

给定两个队列,
Q1
Q2

  • 10个消费者
  • 每个消费者都可以处理来自第一季度和第二季度的消息
  • 在任何给定的时间,只有2个使用者应该处理来自第2季度的消息
  • 所有10个消费者都可以同时处理来自Q1的消息
对问题陈述的评论

首先,假定队列是独立的。独立进程
P
将具有队列
Q
,因此
Q1
为进程
P1
服务。这是一个严格的数学要求-不能为单个进程定义两个队列
P

因此,第二个约束在数学上是不正确的,原因与您无法编写一个有效的函数来交替地接受
string
bool
类型的参数相同。它必须接受其中一个,因为它们是不兼容的类型,或者它必须接受类型的单个公共祖先,而不考虑子类型。这是的一个变体

重新定义问题

系统中总共有12个用户:

  • Q1
    有10个消费者
  • Q2
    有2个消费者
  • [重要信息]队列之间不共享使用者
RabbitMQ中是否有任何我们可以指定的配置,以便RabbitMQ仅将2条消息从Q2推送到任何空闲消费者,并仅在确认后推送到下2条消息,即使其他消费者是空闲的并准备好消费

根据问题的新定义,您有两种选择:

  • 使用a-消费者处理完最后一条消息后,立即从队列中提取下一条消息
  • 使用限制为1。这将立即为每个消费者发送第一条和第二条消息,然后在确认该消费者的下一条消息时,一次发送一条附加消息。这有点复杂,但如果您的延迟裕度小于10毫秒,则可能有意义

  • 注意通过正确定义问题空间,我们消除了一个基本问题,即试图找出如何确保在任何时候只有两个消费者在处理
    Q2
    消息。

    尝试3.8+版的新功能“单一活动消费者”

    单个活动消费者允许在队列中一次只有一个消费者,并且在活动消费者被取消或死亡的情况下故障转移到另一个注册消费者。 当消息必须按照它们到达队列的相同顺序被消费和处理时,只有一个消费者消费是有用的。 声明队列时可以启用单个活动使用者,并且x-Single-active-consumer参数设置为true


    通常由消费者通过某种内部费率限制来“过度消费”消息。根据您的库,您只需在订阅回调中阻塞,直到您准备好接收新邮件。非常感谢Luke的快速响应。我可以通过预取计数和限制concurrentConsumers来实现这一点。但是,是的,我必须限制订阅此Q的消费者数量。虽然链接可能会回答这个问题,但将来可能会删除链接或将信息移动到另一个URL。因此,最好在您的答案中提供一些信息,以便将来的读者访问,即使发生了这种情况。