(翻译)RabbitMQ优先级队列支持

编程

原文地址:https://www.rabbitmq.com/priority.html

一、概览

在3.5.0版本之后,RabbitMQ已经实现了优先级队列。你可以通过客户端设置额外的参数来将一个普通队列转换成优先级队列(但是该功能不能修改policy实现)。优先级队列支持的最大优先级是255,但是推荐使用1~10的数字。

二、通过客户端声明优先级队列

可以通过x-max-priority参数来声明一个优先级队列。这个参数必须是一个介于1~255之间的正整数,表示该队列支持的最大优先级。下边是示例:

Channel ch = ...;

Map<String, Object> args = new HashMap<String, Object>();

args.put("x-max-priority", 10);

ch.queueDeclare("my-priority-queue", true, false, false, args);

之后发布消息的一方就可以通过设置basic.properties的priority参数来发送带有优先级的消息。数字越大,优先级越高。

RabbitMQ从设计上不支持通过策略声明优先级队列。

三、现象

AMQP 0-9-1规范在描述优先级的时候有一些模糊。规范提到所有的队列都必须支持两个优先级,可能的话最好支持十个。但是它没有定义当消息未声明优先级时应该怎么处理。

与AMQP 0-9-1规范相反,RabbitMQ的队列默认不支持优先级。当创建队列时,开发者可以设置一个合理的最大优先级,但是需要考虑以下几点:

  • 队列每有一个优先级都会带来额外的内存、磁盘消耗。CPU同样也会有额外的占用,特别是在消费消息时,所以你不应该创建太大的优先级。
  • 消息的priority参数是一个无符号字节,所以优先级必须在0~255之间
  • 没有priority参数的消息优先级会被当作0。优先级超过队列最大优先级设置的消息会被调整为队列的最大优先级。

四、队列的最大优先级和资源消耗

如果你要用到优先级队列,我们建议你把最大值设置到10。当前,你设置的优先级数量越多,就会占用更多的Erlang进程,从而导致更多的CPU消耗。运行时调度同样会受到影响。

五、与消费方的交互

理解消费方是如何处理优先级队列是非常重要的。通常情况下,消费方在确认消息之前会收到大量的消息——消息的数量仅仅会受到网络的限制。

所以当一个“饥饿的”消费者连接到一个频繁发送消息的空队列的时候,消息会直接被消费而不会在队列中等待。在这种情况下,优先级设置将没有任何作用。

大多数情况下,你可能需要在消费者的手动确认模式中,通过basic.qos方法来限制每次消费的消息数量,从而允许消息在队列中按照优先级排序

六、与其他特性交互

通常情况下优先级队列拥有标准RabbitMQ队列的所有特性:持久化、换页机制(内存数据持久化到硬盘)、镜像等等。开发人员需要注意一下几点。

设置了过期的消息仍然只会在队列的头部过期。这意味着到期的低优先级消息会被未过期的高优先级消息卡住。这些消息将永远不会被消费,但他们会出现在队列的统计数据里。

设置了最大长度的队列通常会丢掉头部的消息来满足长度限制。这意味着高优先级的消息会被丢弃掉来给低优先级的消息腾位子,这可能不是你期望的。

以上是 (翻译)RabbitMQ优先级队列支持 的全部内容, 来源链接: utcz.com/z/517093.html

回到顶部