消费者优先级
概述
消费者优先级允许您确保高优先级消费者在处于活动状态时接收消息,只有当高优先级消费者阻塞时,消息才会传递给低优先级消费者。
通常,连接到队列的活动消费者会以循环方式接收来自该队列的消息。当使用消费者优先级时,如果存在多个具有相同高优先级的活动消费者,则消息将以循环方式传递。
活动消费者的定义
以上段落将消费者称为活动或阻塞。在任何时刻,任何给定的消费者要么是其中之一。活动消费者是可以接收消息而无需等待的消费者。如果消费者无法接收消息,则会变为阻塞状态——因为其通道在发出basic.qos
后达到未确认消息的最大数量,或者仅仅因为网络拥塞。
因此,对于每个队列,至少必须满足以下三种情况之一
- 没有活动消费者
- 队列为空
- 队列正忙于向消费者传递消息
请注意,消费者可以在每秒内多次在活动和阻塞之间切换。因此,我们不会通过管理插件或rabbitmqctl公开消费者是否处于活动或阻塞状态。
当使用消费者优先级时,您可以预期最高优先级的消费者将接收所有消息,直到它们被阻塞,此时较低优先级的消费者将开始接收一些消息。重要的是要了解 RabbitMQ 仍然会优先传递消息——如果存在准备就绪的活动低优先级消费者,它不会等待高优先级阻塞消费者解除阻塞。
使用消费者优先级
在basic.consume
方法中将x-priority
参数设置为整数值。未指定值的消费者优先级为 0。数字越大表示优先级越高,可以使用正数和负数。
例如(在 Java 中)
Channel channel = ...;
Consumer consumer = ...;
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-priority", 10);
channel.basicConsume("my-queue", false, args, consumer);
这将创建一个优先级为 10 的新消费者。