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,任务的定时提醒

相关推荐
鶴哥只手遮天26 分钟前
Spring AI Alibaba 深度技术系列-第 05 章 编译与执行引擎:CompiledGraph、GraphRunner与三段式 Executor
java·人工智能·开源
开开心心_Every43 分钟前
免费压缩软件WinRAR无弹窗、广告干扰
java·开发语言·前端·spring·智能手机·word·winrar
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序的个人智能刷题助手的设计与实现》
java·spring boot·mysql·微信小程序·uniapp·个人智能刷题助手系统
步行cgn1 小时前
Spring MVC 中实现 request 域效果的几种方式
java·后端
Thomas.Sir1 小时前
第3课:SpringBoot4.x 自动配置原理:@EnableAutoConfiguration底层源码剖析
java·spring boot
Rain的Java大神之路1 小时前
MySQL 被高并发打爆?从定位到分库分表逐层拆解(含秒杀库存实战)
java·后端·面试
cc_瀚海知行1 小时前
工具调用 6|助手什么时候该停下来?
java·服务器·前端·人工智能·python·ai
YDS8291 小时前
Small Spring IOC篇:应用上下文实现和Bean的扩展
java·后端·spring
Pniubi1 小时前
ConcurrentHashMap拆分线程池难点再讲
java·jvm
golang学习记1 小时前
IDEA 的 Java 智能,现在跑到 Cursor 和 VS Code 里去了
java·ide·vscode·intellij-idea·claude code