理论和实践详解RabbitMQ优先级队列(priority queues)(带测试样例及分析)

1 缘起

接上一篇:RabbitMQ惰性/延迟队列
继续补充RabbitMQ队列知识,
不过优先级队列有啥用?
排队的排队呗。
本来队列就是先进先出,这是第一层排队,
优先级队列则是对队列中的数据按照其优先级进行第二次排队,
高优先级的先被消费。
应用场景:
(1)客服系统:VIP会员、普通会员、游客等,按优先级处理问题;
(2)订单系统:预购订单,优先处理VIP。
(3)等,任何需要按照优先级处理任务的系统。

2 优先级队列

RabbitMQ从3.5.0版本开始支持优先级队列,队列优先级取值范围:[0, 255]的整数,推荐使用[1, 10]区间的整数。保证性能,如果使用过多级别,会增加CPU负担,尤其是消费的时候。
为队列配置优先级属性,通过x-max-properity参数进行设置,默认队列优先级为0,如果为队列配置优先级属性,请从1开始。

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);

这里提一句,无法通过Policy配置队列优先级。
为队列配置优先级后,传入的消息同样需要配置优先级,如果消息的优先级值高于队列的最大优先级,那么,该消息的优先级会被视为最高队列优先级。
注意,队列优先级生效是有条件的,即优先级队列中需要先累计一定数量的数据,消费者消费时才会按照消息优先级进行消费,如果是即时消费数据,则不会有优先级可言。
应该过期的消息仍然只从队列头过期,这意味着与普通队列不同,虽然每个队列的TTL可以使低优先级的消息卡在高优先级消息后面,但是,这些消息永远不会被消费,并且会在保留在队列统计中。
有最大长度集合的队列会从队列头强制丢弃消息,意味着高有限级的消息可能被低优先级的消息替代。
为什么无法通过Policy配置队列优先级?
Policy是动态的,队列新建后仍然可以修改,而优先级队列只能在新建队列时声明,无法动态修改。

3 Code实践

3.1 配置优先级队列并写入数据

由上面可知,指定队列为优先级队列,需要在新建队列时指定,
通过x-max-priority参数配置优先级,
在新建队列的同时,向队列中写入带优先级的数据,
优先级从低到高:0->6,主要是为了验证消费是按照由高到低的顺序消费:6->0,
测试样例如下。

package com.monkey.java_study.mq.rabbitmq;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory

你可能感兴趣的:(#,消息队列,java-rabbitmq,rabbitmq,java)