目录

  • 一、消息堆积问题
  • 二、解决消息堆积的三种思路
  • 三、惰性队列
    • 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高级特性-惰性队列相关推荐

  1. RabbitMQ高级特性——死信队列DLX以及代码测试

    大伙可以到我的RabbitMQ专栏获取更多信息 demo示例这里拿 概述 死信队列,缩写DLX(dead letter exchange 死信交换机),当消息称为dead message之后,会被重新 ...

  2. RabbitMQ(二):RabbitMQ高级特性

    RabbitMQ(二):RabbitMQ高级特性 RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitM ...

  3. RabbitMQ 高级特性(吐血猝死整理篇)

    文章目录 RabbitMQ 高级特性 消息可靠性投递(可靠性发送) 事务机制 代码实现 发送方确认机制 为什么比事务性能好 示例代码 测试一下QPS 持久化存储 TTL 队列 死信队列(DLX) 延迟 ...

  4. 3 RabbitMQ高级特性 3

    主要为大家讲解RabbitMQ的高级特性和实际场景应用, 包括消息如何保障 100% 的投递成功 ? 幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费问题? Confirm确认消息. ...

  5. RabbitMQ高级特性

    文章目录 1. 简述 2. 特性示例: 2.1 消息可靠性投递 2.2 Consumer Ack 2.3 消费端限流 2.4 TTL 2.5 死信队列 2.6 延迟队列 1. 简述 在rabbitMQ ...

  6. 【消息中间件】RabbitMQ 高级特性与应用问题

    消息的可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 r ...

  7. 消息中间件--RabbitMQ ---高级特性之消费端ACK与重回队列

    什么是消费端的ACK和重回队列? 消费端的手工ACK和NACK 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿 如果由于服务器宕机等严重问题,那我们就需要手工进行ACK保障 ...

  8. RabbitMQ高级特性(五):RabbitMQ之死信队列DLX

    一.死信队列简介 (1)死信队列 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就 ...

  9. 1-8 (4). RabbitMQ高级特性-消费端ACK

    Consumer ACK 指Acknowledge,确认 有三种方式: (1)自动确认:acknowledge="none"(默认) (2)手动确认:acknowledge=&qu ...

最新文章

  1. activemq 开启监听_ActiveMQ 消息监听 MessageListener 的使用
  2. Gartner发布2021年重要战略科技趋势!
  3. 有勇气的牛排 --- 大数据
  4. matlab的实用与仿真,MATLAB建模与仿真实用教程
  5. mui HTML5 plus 下载文件
  6. 信息学奥赛一本通(1047:判断能否被3,5,7整除)
  7. 【kafka】Apache Kafka 0.11版本新功能简介
  8. Oracle RAC的五大优势及其劣势
  9. CART树算法的剪枝算法
  10. 安丘妇幼保健院智能照明监控系统的设计与应用-安科瑞耿敏花
  11. python笔记之ArcPy简介
  12. dns服务器响应 异常,DNS云学堂|快速定位DNS解析异常问题,牢记这四种DNS状态码...
  13. 95后00后音乐人群已成原创音乐创作主力军;全球游戏品类App留存率下滑10% | 美通社头条...
  14. 聊天机器人之知识图谱 Freebase 简介
  15. 小白的jquery学习之路之04效果新闻向上无缝循环显示
  16. uniapp生成android并调用第三方sdk的拍照进行身份证识别
  17. 区块链软件公司:区块链赚钱的领域有哪些
  18. 三、使用Arduino控制WS2812B灯
  19. 数论:最大公约数与最小公倍数的应用:最大公约数和最小公倍数问题
  20. 使用python调用高德地图的web服务

热门文章

  1. Python----python手机号码格式校验
  2. 运维工程师与php,php新手入门的基础内容①
  3. Vue 移动端实现调用相机扫描二维码或条形码
  4. 词性标注:基于MaxEnt的中文词性标注模型实现
  5. 大数据资源争夺战此起彼伏 对用户而言是福是祸?
  6. java 数字大小写转换_阿拉伯数字大小写转换java工具
  7. java--案例:[Random]随机100-200的数、班级点名器、控制台输入三个数,输出最大值,或最小值?
  8. IDEA 黄色警告 found duplicated code in this file finds duplicated code
  9. .NET 函数调用反转
  10. 基于N-gram的双向最大匹配中文分词