延迟队列

  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当中