47

RabbitMQ 有消息优先级的概念吗?我有一个问题,一些更重要的消息正在被放慢,因为队列中的消息不太重要。我希望高优先级的优先并排在队列的最前面。

我知道我可以使用两个队列来近似这一点,一个“快”队列和一个“慢”队列,但这似乎是一个 hack。

有谁知道使用 RabbitMQ 的更好解决方案?

4

7 回答 7

84

这个问题的答案已经过时了。从 RabbitMQ 3.5.0 开始,现在有对 AMQP 标准每消息优先级的核心支持。该文档包含所有血淋淋的细节,但简而言之:

  • 您需要在创建队列时定义队列的优先级范围;
  • 没有设置优先级的消息的优先级为 0;
  • 数字优先级高于队列中设置的最大值的消息将获得队列支持的最高优先级。

文档中有更有趣的警告。非常值得一读。

于 2015-03-16T01:20:44.097 回答
21

Rabbit 没有优先级的概念,正如 Brian 简洁地说的那样,前面的那个首先到达那里。;-)

我建议实施一组队列来满足您的特定消息传递需求,并让这些队列模拟您的优先级需求,例如,将它们称为“MyQueueP1”、“MyQueueP2”等等,然后让我们的消费者检查 P1在 P2 (等)之前,首先从那里发送服务消息。

如果你有一个高优先级的消息,你可以通过合适的路由键将它发布到适当的优先级队列中,瞧。

[更新]检查这个问题: In a FIFO Queueing system, what's the best way the implementation of priority messages

[更新] 根据最近的 RabbitMQ 版本 3.5.0,这个答案现在已经过时,应该被认为只对这个版本之前的版本有效。 https://stackoverflow.com/a/29068288/489888

于 2012-05-25T06:20:41.533 回答
10

IIRC RabbitMQ 仍然使用 AMQP 协议版本 0.9.1(在此处获取规范)。该规范明确提到了消息优先级:

Messages may have a priority level. A high priority message is sent ahead of lower     priority messages
waiting in the same message queue. When messages must be discarded in order to maintain a specific
service quality level the server will first discard low-priority messages.

和:

Note that in the presence of multiple readers from a queue, or client transactions, or use of priority fields,
or use of message selectors, or implementation-specific delivery optimisations the queue MAY NOT
exhibit true FIFO characteristics.

规范说优先级是必须的,所以我猜 RabbitMQ 应该实现它,但您可能需要查阅它的文档。

于 2012-05-25T02:51:18.963 回答
5

是的,RabbitMQ 支持优先级队列。

要使队列作为优先级队列工作,x-max-priority请在声明队列时提供属性。

属性x-max-priority定义队列支持的最大优先级数。

在 Java 中,您可以执行以下操作:

Map<String, Object> props = new HashMap<>();
props.put("x-max-priority", 10); // max priority number as 10
channel.queueDeclare(QUEUE_NAME, durable, false, false, props);

要发布特定优先级的消息,请执行以下操作:

String message = "My message with priority 7";
AMQP.BasicProperties.Builder basicProps = new AMQP.BasicProperties.Builder();
basicProps.contentType("text/plain")
            .priority(7);
channel.basicPublish("", QUEUE_NAME, basicProps.build(), message.getBytes());
于 2017-06-12T11:50:16.750 回答
0

我们可以通过从https://www.rabbitmq.com/community-plugins.html安装插件 rabbitmq_priority_queue 使 rabbitmq 成为分布式优先级队列。您必须下载插件 rabbitmq_priority_queue-3.3.x-72d20292.ez 并放入您的 rabbit mq 安装目录的 plugins 文件夹中。重新启动服务器。现在您可以按优先级将项目插入队列并相应地使用它,已将示例代码粘贴在如何轮询 RabbitMQ 以连续按优先级顺序获取消息?.

于 2014-09-11T19:53:00.307 回答
-3

RabbitMQ / AMQP 肯定有一个消息优先级的概念 - 队列头部的消息优先于它后面的消息,并且该消息优先于它后面的消息,以此类推,无穷无尽。

你能改变那个模型吗?没有!:)

于 2012-05-25T02:39:49.663 回答
-11

如果它实现了优先级,它就不是一个 MQ。

MQ 是数据的电子邮件。并且在所有数据传输中保持顺序是至关重要的。如果您切换顺序,删除发生在插入之前,更新会失去顺序。没有什么能正常工作。

您可能有一个有效的实现,但也有一些例外,但我发现大多数优先级队列的设计是因为人们对他们的系统架构和其中部件的交互进行了肤浅的思考。保持事物的顺序几乎总是正确的做法,对于实体内和实体间的交互都是如此。

为了说事件 A 的优先级高于事件 B,这两个事件必须始终解耦。当这种情况发生时,人们想知道为什么它们存在于同一个队列结构中。再说一次,如果它与有效载荷相关,那么该有效载荷的计算工作量也会影响系统的性能,因此请尽早做出决定,即在使有效载荷有意义之前。

于 2013-05-06T23:48:28.493 回答