1 延迟队列的概念
延迟队列内部是有序的,延时队列中的元素是可以在指定时间到了之后取出和处理
2 延迟队列使用场景
- 订单在十分钟之内未支付,自动取消
- 新创建的店铺,如果在十天内没有上传过商品,则自动发送消息提醒
- 用户组成成功后,如果三天没有登陆,进行短信提醒
- 用户发起退款,如果三天内没有得到处理则通知相关运营人员
- 预定会议室,需要在预定的时间点前十分钟通知各个人员参加会议
订单系统,如果30分钟没有付款,自动修改订单状态
30 分钟
3 RabbitMQ中的 TTL
TTL : RabbitMQ 中一个消息或者队列属性,表名一条消息或者这个队列的所有消息的最大存活时间,单位是毫秒。也就是一条消息设置了 TTL 属性,或者进入了 设置 TTL 属性的队列,那么这条消息如果在 TTL 时间内没有被消费,就会变为 “死信”。如果同时配置队列 TTL 和 消息的 TTL , 那么较小的那个值将会被使用。
1 消息设置 TTL
2 队列设置TTL (使用居多)
创建队列的时候设置队列的 ”x-message-ttl“
3 两者的区别
如果设置队列的 TTL 属性,那么一旦消息过期,就会被队列丢弃(如果配置了私信队列就会被丢弃到死信队列中)。
消息设置 TTL , 消息即使过期,也不一定被放上丢弃。因为消息是否过期是在即将投递到消费者之前判定的。如果当前队列有验证的消息积压情况,则已经过期的消息
也许还能存货很长的时间,如果消息不设置 TTL,表示消息永远不会过期,如果 TTL 设置为0,表示除非此刻可以直接将改消息投递给消费者,否则该消息会被丢弃。
4 代码实现
1. 存在一个倒计时机制: time to live (ttl)
可以让单独的消息过期,也可以设置整个队列消息的过期时间 而rabbitmq会有限取两个值的最小
2. 当到达时间点的时候回触发一个发送消息的事件:Dead Letter Exchange (DLX)
x-dead-letter-exchange 将过期的消息发送到指定的 exchange 中 . x-dead-letter-routing-key 将过期的消息发送到自定的 route当中