RabbitMQ高级特性-惰性队列
目录
- 一、消息堆积问题
- 二、解决消息堆积的三种思路
- 三、惰性队列
- 1、命令行修改惰性队列
- 2、用SpringAMQP声明惰性队列
- @Bean的方式
- 注解方式
- 测试发送消息
- 3、惰性队列的优点
- 4、惰性队列的缺点
- 代码
一、消息堆积问题
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,知道队列存储消息达到上限。最早接收到的消息,可能就会成为死信,会被丢弃,这就是消息堆积的问题。
二、解决消息堆积的三种思路
- 增加更多消费者,提高消费速度
- 在消费者内开启线程池加快消息处理速度
- 扩大队列容积,提高堆积上限
三、惰性队列
从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列。
惰性队列的特征如下:
- 接收到消息后直接存入磁盘而非内存
- 消费者要消费消息时才会从磁盘中读取并加载到内存
- 支持数百万条的消息存储
而要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可。可以通过命令行将一个运行中的队列修改为惰性队列
1、命令行修改惰性队列
rabbitmqctl set_policy Lazy "^myqueue$" '{"queue-mode":"lazy"}' --apply-to-queues
2、用SpringAMQP声明惰性队列
@Bean的方式
@Beanpublic Queue lazyQueue() {return QueueBuilder.durable("lazy.queue")// 开启x-queue-mode: lazy.lazy().build();}
注解方式
/*** 声明惰性队列监听*/@RabbitListener(queuesToDeclare = @Queue(name = "lazy.queue",durable = "true",arguments = @Argument(name = "x-queue-mode", value = "lazy")))public void listenLazyQueue(String msg) {log.info("接收到了 lazy.queue 队列的消息:{}",msg);}
测试发送消息
@Testpublic void testLazyQueue() throws InterruptedException {long b = System.nanoTime();for (int i = 0; i < 1000000; i++) {// 1.准备消息Message message = MessageBuilder.withBody("hello, Spring".getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT).build();// 2.发送消息rabbitTemplate.convertAndSend("lazy.queue", message);}long e = System.nanoTime();System.out.println(e - b);}@Testpublic void testNormalQueue() throws InterruptedException {long b = System.nanoTime();for (int i = 0; i < 1000000; i++) {// 1.准备消息Message message = MessageBuilder.withBody("hello, Spring".getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT).build();// 2.发送消息rabbitTemplate.convertAndSend("normal.queue", message);}long e = System.nanoTime();System.out.println(e - b);}
我们可以发现惰性队列直接回写入磁盘,page-out,而普通队列隔一段时间写入磁盘
3、惰性队列的优点
- 基于磁盘存储,消息上限高
- 没有间歇性的page-out,性能比较稳定
4、惰性队列的缺点
- 基于磁盘存储,消息时效性会降低
- 性能受限于磁盘的IO
代码
地址:https://gitee.com/edevp/mq-advanced-demo.git
RabbitMQ高级特性-惰性队列相关推荐
- RabbitMQ高级特性——死信队列DLX以及代码测试
大伙可以到我的RabbitMQ专栏获取更多信息 demo示例这里拿 概述 死信队列,缩写DLX(dead letter exchange 死信交换机),当消息称为dead message之后,会被重新 ...
- RabbitMQ(二):RabbitMQ高级特性
RabbitMQ(二):RabbitMQ高级特性 RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitM ...
- RabbitMQ 高级特性(吐血猝死整理篇)
文章目录 RabbitMQ 高级特性 消息可靠性投递(可靠性发送) 事务机制 代码实现 发送方确认机制 为什么比事务性能好 示例代码 测试一下QPS 持久化存储 TTL 队列 死信队列(DLX) 延迟 ...
- 3 RabbitMQ高级特性 3
主要为大家讲解RabbitMQ的高级特性和实际场景应用, 包括消息如何保障 100% 的投递成功 ? 幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费问题? Confirm确认消息. ...
- RabbitMQ高级特性
文章目录 1. 简述 2. 特性示例: 2.1 消息可靠性投递 2.2 Consumer Ack 2.3 消费端限流 2.4 TTL 2.5 死信队列 2.6 延迟队列 1. 简述 在rabbitMQ ...
- 【消息中间件】RabbitMQ 高级特性与应用问题
消息的可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 r ...
- 消息中间件--RabbitMQ ---高级特性之消费端ACK与重回队列
什么是消费端的ACK和重回队列? 消费端的手工ACK和NACK 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿 如果由于服务器宕机等严重问题,那我们就需要手工进行ACK保障 ...
- RabbitMQ高级特性(五):RabbitMQ之死信队列DLX
一.死信队列简介 (1)死信队列 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就 ...
- 1-8 (4). RabbitMQ高级特性-消费端ACK
Consumer ACK 指Acknowledge,确认 有三种方式: (1)自动确认:acknowledge="none"(默认) (2)手动确认:acknowledge=&qu ...
最新文章
- activemq 开启监听_ActiveMQ 消息监听 MessageListener 的使用
- Gartner发布2021年重要战略科技趋势!
- 有勇气的牛排 --- 大数据
- matlab的实用与仿真,MATLAB建模与仿真实用教程
- mui HTML5 plus 下载文件
- 信息学奥赛一本通(1047:判断能否被3,5,7整除)
- 【kafka】Apache Kafka 0.11版本新功能简介
- Oracle RAC的五大优势及其劣势
- CART树算法的剪枝算法
- 安丘妇幼保健院智能照明监控系统的设计与应用-安科瑞耿敏花
- python笔记之ArcPy简介
- dns服务器响应 异常,DNS云学堂|快速定位DNS解析异常问题,牢记这四种DNS状态码...
- 95后00后音乐人群已成原创音乐创作主力军;全球游戏品类App留存率下滑10% | 美通社头条...
- 聊天机器人之知识图谱 Freebase 简介
- 小白的jquery学习之路之04效果新闻向上无缝循环显示
- uniapp生成android并调用第三方sdk的拍照进行身份证识别
- 区块链软件公司:区块链赚钱的领域有哪些
- 三、使用Arduino控制WS2812B灯
- 数论:最大公约数与最小公倍数的应用:最大公约数和最小公倍数问题
- 使用python调用高德地图的web服务
热门文章
- Python----python手机号码格式校验
- 运维工程师与php,php新手入门的基础内容①
- Vue 移动端实现调用相机扫描二维码或条形码
- 词性标注:基于MaxEnt的中文词性标注模型实现
- 大数据资源争夺战此起彼伏 对用户而言是福是祸?
- java 数字大小写转换_阿拉伯数字大小写转换java工具
- java--案例:[Random]随机100-200的数、班级点名器、控制台输入三个数,输出最大值,或最小值?
- IDEA 黄色警告 found duplicated code in this file finds duplicated code
- .NET 函数调用反转
- 基于N-gram的双向最大匹配中文分词