IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【架构师面试-消息队列-6】-MQ消息的积压与过期解决方案 -> 正文阅读

[Java知识库]【架构师面试-消息队列-6】-MQ消息的积压与过期解决方案

1:消息积压

场景

线上故障,几千万条数据在MQ里积压了7-8个小时。

这时,怎么处理呢?修复consumer端的BUG,然后等待8个小时消费完毕吗?肯定不行!一个消费者一秒是1000条,一秒3个消费者是3000条,一分钟是18万条,1000多万条。 如果你积压了上千万数据,即使消费者恢复,也需要2小时以上才能恢复。

解决方案

临时扩容,加快消费速度

1. 先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉。

2. 临时建立好原先10倍或者20倍的queue数量

3. 然后写一个临时分发消息的consumer程序,这个程序部署上去消费积压的消息,消费之后不做耗时处理,直接均匀轮询写入临时建好分10数量的queue里面。

4. 紧接着征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的消息。

5. 这种做法相当于临时将queue资源和consumer资源扩大10倍,以正常速度的10倍来消费消息。

6. 等快速消费完了之后,恢复原来的部署架构,重新用原来的consumer机器来消费消息。

2:消息过期

消息过期、丢失,发送失败如何处理?任由消息消失?

死信队列:当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DeadLetter Exchange(死信交换机 简写:DLX)。

消息成为死信的三种情况

1. 队列消息长度到达限制;

2. 消费者拒接消息(basicNack),并且不把消息重新放回源队列,requeue=false;

3. 源队列存在消息过期设置,消息到达超时时间未被消费;

设置死信队列绑定死信交换机

给队列设置参数: x-dead-letter-exchange 和 x-dead-letter-routing-key

?

3:死信队列案例

目标

演示消息队列中消息超时失效

实现步骤

1. 在RabbitMQ管理控制台中,创建死信队列 deadQueue

2. 在RabbitMQ管理控制台中,创建死信交换机 deadExchange

3. 死信队列绑定死信交换机,路由键为 order.dead

4. 消息队列order.B绑定死信交换机

5. 向消息队列 order.B 中发送消息【消息队列order.B中的消息失效时间为5秒】

6. 在RabbitMQ管理控制台中,将消息队列 order.B 绑定到交换机 order_exchange 上

7. 等待5秒,消息队列order.B中的消息进入死信队列

实现过程

1. 在RabbitMQ管理控制台中,创建死信队列 deadQueue

2. 在RabbitMQ管理控制台中,创建死信交换机 deadExchange

3. 死信队列绑定死信交换机,路由键为 order.dead

4. 删除 order.B 消息队列,重建之后绑定死信交换机

5. 向消息队列 order.B 中发送消息【消息队列order.B中的消息失效时间为5秒】

6. 等待5秒,消息队列order.B中的消息进入死信队列

4:小结

1. 死信交换机和死信队列和普通的没有区别

2. 当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列

3. 消息成为死信的三种情况:

????????队列消息长度到达限制;

????????消费者拒接消费消息,并且不重回队列;

????????原队列存在消息过期设置,消息到达超时时间未被消费;

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 07:59:26  更:2021-11-25 08:00:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:22:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码