消费者优先级
概述
消费者优先级允许您确保高优先级消费者在活跃时能够接收消息,仅当高优先级消费者发生阻塞时,消息才会分发给低优先级消费者。
通常情况下,连接到队列的活跃消费者会以轮询(round-robin)方式接收消息。当使用消费者优先级时,如果存在多个具有相同最高优先级的活跃消费者,消息将以轮询方式进行分发。
活跃消费者的定义
上述段落中提到的“活跃”(active)或“阻塞”(blocked)消费者,在任何时刻,任一消费者必定处于其中一种状态。活跃消费者是指无需等待即可接收消息的消费者。如果消费者无法接收消息,则称其为“阻塞”状态——这可能是因为在其执行 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 的新消费者。