RabbitMQ和消息优先级

时间:2012-05-24 20:50:52

标签: rabbitmq

RabbitMQ是否有任何消息优先级的概念?我有一个问题是一些更重要的消息由于在队列中排在它之前的不太重要的消息而变慢。我希望优先级高的优先级移动到队列的前面。

我知道我可以使用两个队列“快速”队列和“慢”队列来估计这个,但这似乎是一个黑客。

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

7 个答案:

答案 0 :(得分:50)

这个问题的答案已经过时了。从RabbitMQ 3.5.0开始,现在有针对AMQP标准的每个消息优先级的内核支持。 documentation具有所有血腥细节,但简而言之:

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

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

答案 1 :(得分:20)

兔子没有优先权的概念,正如布莱恩简洁地说的那样,前面的那个首先到达那里。 ; - )

我建议实现一组队列,用于满足您的特定消息传递需求,让这些队列模拟您的优先级需求,比如称他们为“MyQueueP1”,“MyQueueP2”等,然后让我们的消费者(s) )在P2(等)之前检查P1,然后从那里检查服务消息。

如果您有一条高优先级的消息,您可以通过合适的路由密钥将其发布到适当的优先级队列。

[更新] 检查这个问题: In a FIFO Qeueing system, what's the best way the to implement priority messaging

[更新] 根据最近的RabbitMQ版本3.5.0,这个答案现已过时,并且应该被认为仅适用于此版本之前的版本。 https://stackoverflow.com/a/29068288/489888

答案 2 :(得分:10)

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

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应该实现它,但你可能想查阅它的文档。

答案 3 :(得分:2)

是的,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());

答案 4 :(得分:0)

我们可以通过从https://www.rabbitmq.com/community-plugins.html安装插件rabbitmq_priority_queue使rabbitmq成为分布式优先级队列。你必须下载rabbitmq_priority_queue-3.3.x-72d20292.ez插件并将你的rabbit mq安装目录放在plugins文件夹中。重启服务器。现在,您可以使用优先级将项目插入队列并相应地使用它,并将示例代码粘贴到How to poll the RabbitMQ to get messages in order of priority continuously?中。

答案 5 :(得分:-2)

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

你能改变那个模特吗?不! :)

答案 6 :(得分:-8)

如果它实现了优先级,那么它就不是MQ。

MQ是用于数据的电子邮件。并且在所有数据传输中保存顺序至关重要。如果切换顺序,删除会在插入之前发生,更新会不按顺序进行。什么都不能正常工作。

你可能有一个有效的实现,有一些例外,但我发现大多数优先级队列的设计是因为人们正在考虑关于他们的系统架构和其中各部分的交互的浅层思考。对于实体内和实体间的交互,保持事物的顺序几乎总是正确的。

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