RabbitMQ优先级消息

简介: RabbitMQ优先级消息

使用场景

 

对于Mq中可能产生堆积消息的情景来说,如果消息都是不需要实时处理的,那可以等待消费者慢慢的去处理就行了,然后实际使用中我们会遇到这样一种情况,就是mq队列堆积消息很多,但是每条消息处理的有的很慢有的很快,所以此时这种场景就比较适合使用mq的优先级来保证消息的提前消费,让处理慢的消息最后消费

 

 

下面使用java链接mq演示一下消息的处理

初始化优先级队列

 

# 交换机        public static final String EXCHANGE_TEST = "test";# 路由key    public static final String PRIORITY_ROUTE_KEY_TEST = "priority.test";# 队列    public static final String QUEUE_PRIORITY = "queue.priority.1";    @Bean    public TopicExchange testExchange() {        return new TopicExchange(EXCHANGE_TEST);    }    # 声名优先级队列,制定最大优先级10       @Bean    public Queue priority_Queue() {        Map<String, Object> map = new HashMap<String, Object>(1);        map.put("x-max-priority", 10);        return new Queue(QUEUE_PRIORITY, true, false, false, map);    }    # 队列与交换机的绑定   @Bean    public Binding myBindingPriority() {        return new Binding(QUEUE_PRIORITY, Binding.DestinationType.QUEUE, EXCHANGE_TEST, PRIORITY_ROUTE_KEY, null);    }

 

 

消息生产者代码

 

private RabbitTemplate rabbitTemplate;     public void sendPriorityMsg(String exchange, String routeKey, Object msg, Integer priority) {        MessagePostProcessor messagePostProcessor = message -> {            MessageProperties messageProperties = message.getMessageProperties();            //设置编码            messageProperties.setContentEncoding("utf-8");            //设置过期时间10*1000毫秒            messageProperties.setPriority(priority);            return message;        };        rabbitTemplate.convertAndSend(exchange, routeKey, msg, messagePostProcessor);    }

 

 

发送消息

 

public String sendMsg() {            // 发送了两个优先级的任务        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务1", 1);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务1-2", 1);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务1-3", 1);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务1-4", 1);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务1-5", 1);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务2-5", 5);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务2-4", 5);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务2-3", 5);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务2-2", 5);        msgProducer.sendPriorityMsg(RabbitConfig.EXCHANGE_TEST, RabbitConfig.PRIORITY_ROUTE_KEY, "测试优先级任务2-1", 5);        return "success";    }

 

 

启动程序发送消息

 

此时rabbitmq的管理页面可以看到队列已经创建成功

消费者也是有一个,然后与test交换机进行了绑定

下面开始发送消息,因为我们目前没有订阅队列,也就是和图中类似没有消费者产生,所以现在队列中堆积了10条消息

 

添加消费者

 

@RabbitListener(queues = RabbitConfig.QUEUE_PRIORITY)    @RabbitHandler    public void priority(String content) {        log.info("交换机 test 的消息:" + content);    }

 

此时重新启动程序,消费者消息会自动接受处理了,打印结果如下

此时我们可以明显的看到优先级5的消息优先被处理了,所以到此为止,一个简单的mq优先级消息队列就结束了

 

 

 

 

步骤

1:创建交换机,初始化指定最大优先级的队列

2: 创建生产者发送消息的优先级指定信息

3: 创建消费者监听

相关源码已经提交github或者点击原文

https://github.com/TianPuJun/springboot-demo/tree/master/springboot-rabbitmq


 

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
9月前
|
消息中间件
RabbitMQ中的消息优先级是如何实现的?
RabbitMQ中的消息优先级是如何实现的?
478 0
|
9月前
|
消息中间件 存储 NoSQL
【RabbitMQ教程】第八章 —— RabbitMQ - 幂等性、优先级、惰性
【RabbitMQ教程】第八章 —— RabbitMQ - 幂等性、优先级、惰性
|
消息中间件 安全 调度
RabbitMQ高级特性之-优先级队列(Priority Queue)
RabbitMQ高级特性之-优先级队列(Priority Queue)
688 0
|
消息中间件
RabbitMQ之队列优先级
优先级队列,顾名思义,具有更高优先级的队列具有较高的优先权,优先级高的消息具备优先被消费的特权。 本文主要讲解如何使用RabbitMQ实现队列优先级。 可以通过RabbitMQ管理界面配置队列的优先级属性,如下图的x-max-priority.
3249 0
|
4月前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
310 11
|
4月前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
129 11
|
3月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
4月前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
4月前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
4月前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
102 4