首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RabbitMQ :为多个消费者从队列中发送固定消息

RabbitMQ :为多个消费者从队列中发送固定消息
EN

Stack Overflow用户
提问于 2019-03-09 00:13:42
回答 2查看 1.2K关注 0票数 1

是否有一种方法可以限制RabbitMQ队列只将固定数量的消息从队列发送给消费者?

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

在RabbitMQ中是否有我们可以指定的配置,以便RabbitMQ只将2条消息从Q2推送给任何空闲的使用者,并且只有在它们被确认之后才将下一条消息推送到下一条消息中,即使其他消费者是免费的,并且可以使用。

关于这一问题的更多背景资料:

为什么每次只处理2条消息?:Q2消息正在进行web服务调用,web服务端点(第三方)只能同时处理2条消息。

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

我们能否只配置两个收听Q2的消费者?:我知道我们可以通过只为Q2配置两个消费者来实现这一点,但我试图避免这种情况。如果由于某种原因,这两个消费者下降,Q2的处理将停止。如果配置了10个消费者,我们可以保证处理过程会一直持续到最后一个消费者下降为止。

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

提前谢谢!

EN

Stack Overflow用户

发布于 2019-03-09 16:53:02

我觉得你已经被问题定义所困扰了。你真正需要的是琐碎的东西,所以让我们把它分解一下。

给定两个队列,Q1Q2

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

对问题陈述的评论

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

因此,第二个约束在数学上是不正确的,其原因与您无法编写接受stringbool类型参数的有效函数相同。它必须接受其中一种或另一种,因为它们是不兼容的类型,或者它必须接受这些类型的单一共同祖先而不考虑子类型。这是Liskov代换原理的一个变体。

重新定义问题

该系统共有12名消费者:

  • Q1有10个消费者
  • Q2有2个消费者
  • 重要的使用者不在队列之间共享。

在RabbitMQ中是否有我们可以指定的配置,以便RabbitMQ只将2条消息从Q2推送给任何空闲的使用者,并且只有在它们被确认之后才将下一条消息推送到下一条消息中,即使其他消费者是免费的,并且可以使用。

根据问题的新定义,您有两个选项:

  1. 使用Basic.Get -在使用者处理完最后一条消息后立即从队列中提取下一条消息。
  2. 使用限制为1的消费者预取,这将立即为每个使用者传递第一条和第二条消息,然后在确认该使用者的下一条消息时,一次传递一条附加消息。这有点复杂,但如果延迟间隔小于10毫秒,则可能是有意义的。

Note指出,通过正确定义问题空间,我们消除了基本问题,即如何设法确保在任何时候只有两个消费者在处理Q2消息。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55072701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档