RabbitMQ 工作队列配置问题

Posted

技术标签:

【中文标题】RabbitMQ 工作队列配置问题【英文标题】:RabbitMQ Work Queue Configuration Questions 【发布时间】:2013-01-30 15:57:14 【问题描述】:

我有两个关于 RabbitMQ 工作队列的问题:

    我从 RabbitMQ 教程中了解到,如果我有一个基本的队列消费者客户端(只是一个基本的“Hello, World!”消费者),然后我为同一个队列添加了第二个消费者客户端,然后 RabbitMQ 会自动在这两个队列之间以循环的方式分发消息。是这样吗(无需添加任何额外配置)?

    我的消费者客户端被配置为一次只接收一条消息,使用(GetResponse response = channel.basicGet("my_queue", false)。由于我一次只收到一条消息,是否仍然需要设置 prefetchCount (channel.basicQos(1)) 以进行公平调度?

【问题讨论】:

【参考方案1】:

回答您的问题:

    是的 没有

但是,您的两个问题 1 和 2 不兼容。如果您使用的是消费者,它旨在将消息推送给它,并且您不使用Basic.Get。当您使用消费者时,您需要使用Basic.QoS 来指定消费者一次只能“拥有”一条未确认的消息。 RabbitMQ 不会推送超出 QoS 限制的额外消息。

您的替代方法是使用Basic.Get 从队列中“拉出”,您将控制自己的命运,只要一次运行多少条消息。

这有意义吗?

【讨论】:

说的有道理,那我好像是在“拉扯”。工作队列模型是否仍然适用于“拉”客户端(循环调度)?我的初衷是将消息推送到我的客户端,但是客户端被部署为 Tomcat Web 应用程序,我发现 while(true) 循环不能很好地与 Tomcat (***.com/questions/14164517/…) 配合使用。因此,我使用 Java 的 ScheduledExecutorService 每隔 X 毫秒运行一个客户端,这将只从队列中请求一条消息 我相信无论谁从队列中拉出下一条消息,都会得到下一条消息。循环是无关紧要的,因为你没有发送任何东西。 嗯,所以对于我当前的模型,我的一个“消费者”可能会比另一个拉更多的消息?我之所以这么问,是因为听起来与 Tomcat Web 应用程序相比,在系统级别将这些消费者实现为 Java 客户端可能更有利。 如果不熟悉你的应用程序,很难说。但是,如果您使用的是拉模型,则一个处理多于另一个处理并不重要;它们要么都在满负荷运行,要么一个/两个都处于空闲状态。我是一名工业工程师,并且研究过排队论,所以也许我想多了你的问题...... 您是否考虑过在您的 Java 应用程序中使用 Apache Camel 作为消费者和 AMQP 之间的薄层?此外,让消息消费者在 Tomcat 中运行听起来很奇怪。本质上,Tomcat 是一个允许您运行 HTTP 请求消费者的工具。如果您的消息没有通过 HTTP 请求到达,Tomcat 可能是不必要的复杂性。

以上是关于RabbitMQ 工作队列配置问题的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ延迟队列

RabbitMQ指南(C#)工作队列

消息队列MQ——Spring Boot整合RabbitMQ

简单讲解RabbitMQ

是否可以为 RabbitMQ RPC C# 配置多个/不同的回调队列?

RabbitMQ 请求/响应“RabbitTemplate 未配置为侦听器”