RabbitMq高级特性:TTL,死信队列,延迟队列

本篇博客基于SpringBoot + Spring AMQP来写,代码实现和API调用均使用Spring AMQP的封装展开,和原生amqp-client SDK原理一致,但代码实现会有所不同

目录

一,TTL

应用场景

队列设置TTL

消息设置TTL

二,死信队列

三,延时队列

两种实现方式:

[一,使用TTL + 死信队列](#一,使用TTL + 死信队列)

二,使用延迟队列插件

应用场景


一,TTL

TTL:过期时间,队列和消息都可以设置TTL

应用场景

1,结合死信队列实现延时队列 2,订单超时自动取消 3,定时提醒 等等

队列设置TTL

消息设置TTL

给队列设置TTL,队列过期,所有消息被删除,给消息设置TTL,消息过期不会被立刻删除,而是等到消息在即将被发送给消费者时进行判断,如果已经过期则删除。

二,死信队列

死信:各种原因导致的消息无法被消费的消息称为死信。当消息变成死信之后就会被重新发送到另外的交换机进而把消息放到死信队列。

什么情况消息会变成死信:1,消费者拒绝该消息,或者指定消息不能重新入队

2,消息过期 3,队列达到长度限制(长度可设置) 4,重试次数达到上限

需要实现正常队列和死信交换机之间的绑定

三,延时队列

两种实现方式:

一,使用TTL + 死信队列

这种方式存在明显短板:由于队列先进先出的特点,如先后发送两条数据,第一条过期时间为20s,第二条过期时间为10s,那么就会出现第二条消息早就过期了还没有进入死信队列,因为第一条消息没有过期,第二条消息只能等第一条消息过期之后一起进入死信队列,时效性很差。

二,使用延迟队列插件

RabbitMq官方提供了延迟队列差插件,具体如何下载这里省略
: https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq
下载后插件之后RabbitMq的web控制台创建交换机的类型选项就多了一个x-delaayed-message的类型,使用方法和其他类型交换机相同。

延迟队列不是消息到达交换机后立刻进行转发,而是到达指定时间之后再由交换机路由到队列,消费者监听该队列,有了消息之后立刻拿来消费。

应用场景

1,订单超时自动取消

2,用户发起退款,超时自动审批

3,任务的定时提醒

相关推荐
stark张宇1 小时前
从 Paxos 到 Raft:一文讲透分布式一致性与复制状态机
分布式·后端
长谷深风1111 小时前
Agent 跑了 30 分钟宕机,如何从断点继续?
java·大数据·人工智能·ai·大模型·memory·aiagent
慧都小妮子1 小时前
DevExpress Java 文档处理 API 免费 CTP:PDF、PowerPoint、条码与跨平台部署
java·pdf·powerpoint·devexpress·文档处理·条码生成
泡海椒1 小时前
告别反射低效:JQuick-Java ASM动态调用链性能优化实战
java·python·性能优化
土司大王1 小时前
LeetCode 17 电话号码的字母组合:Java 回溯模板、多叉决策树与复杂度分析
java·leetcode·决策树
小楼昨夜又东风1261 小时前
kafka、rocketmq、rabbitmq,有什么区别
kafka·rabbitmq·rocketmq
CoderYanger2 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
Nuanyt2 小时前
JUC常见核心知识梳理02 AQS ReentrantLock CAS 原子类 线程池
java
CodeStats2 小时前
【Java数据类型】Java底层数据类型原理(上):基本类型、转换与封装核心
java·数据类型·string·封装·转换