RabbitMQ 的高级特性和消息补偿机制
3. 消息过期(TTL)
TTL 全称 Time To Live(存活时间/过期时间)。当消息到达存活时间后,还没有被消费,会被自动清除。
RabbitMQ 可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。
消息过期, 可以让队列统一过期, 也可以让它单独的消息过期。
4. 死信队列
死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为 Dead message (死信)后,可以被重新发送到另一个交换机,这个交换机就是 DLX。
#####消息成为死信的三种情况:
1.队列消息长度到达限制;
2.消费者拒接消费消息,并且不把消息重新放入原目标队列;
3.原队列存在消息过期设置,消息到达超时时间未被消费;
#####死信队列和死信交换机:
死信队列和死信交换机与正常的队列和交换机一模一样, 没有任何区别 !!
如何实现队列与死信交换机绑定 , 给队列设置如下参数:
x-dead-letter-exchange : 设置死信交换机
x-dead-letter-routing-key : 设置死信路由 key
5. 延迟队列
消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。 例如:
延迟队列是一个很强大的功能 , 但是在 RabbitMQ 中并没有提供延迟队列功能。
可以使用:TTL(消息过期)+死信队列组合实现延迟队列的效果。
实现流程图如下 :
6. 消费端限流
![](https://upload-images.jianshu.io/upload_images/24195226-41958323c3fb1e56.png?imageMogr2/auto-orient/strip%7Cimag 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 eView2/2/w/1240)
当系统峰值比较高的时候 , 我们我们可以使用 RabbitMQ 实现削峰填谷, 让我们系统处理的请求更加平稳
实现步骤
设置 akc 机制为手动确认
配置监听容器
7.RabbitMQ 应用问题 (消息补偿机制)
我们通过之前的消息可靠性投递 , ACK 确认机制 , 以及死信队列 , 基本上已经能够保证消息投递成功了 !
为什么还要消息补偿机制呢? 难道消息还会丢失,没错,系统是在一个复杂的环境,不要想的太简单了,虽然以上的三种方案,基本可以保证消息的高可用不丢失的问题,但是作为有追求的程序员来讲,要绝对保证我的系统的稳定性,有一种危机意识。
比如:持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?
评论