本篇博客基于SpringBoot + Spring AMQP来写,代码实现和API调用均使用Spring AMQP的封装展开,和原生amqp-client SDK原理一致,但代码实现会有所不同
目录
[一,使用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,任务的定时提醒