理论和实践详解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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值