RabbitMQ应用之延迟队列

场景举例:订单生单成功后,30分钟未支付自动取消
消息的ttl
  • 队列设置:
    • x-expires:队列ttl,当队列未使用(没有任何消费者、没有被重新声明、过期时间段内未调用过Basic.Get命令)时,会被删除。服务器重启后,持久化的队列过期时间会重新计算,x-expires单位为毫秒,不能设置为0
    • x-message-ttl :队列中消息的ttl
  • 发布消息设置:
    • expiration:单条消息ttl(若x-message-ttl也设置,取最短的ttl)
  • 消息抛出
    • 消息过期后,抛出需要满足两个条件,1个是消息过期,1个实在队列头部
    • 若消息已过期,并且不在头部,当消费者消费掉头部未过期的消息之后,过期的消息仍会被抛出,不会被消费者消费掉。
死信交换器DLX:dead letter exchange
  • dlx和普通交换器并没有区别,可以绑定多个队列
  • 队列声明的时候,可以设置死信参数
    • x-dead-letter-exchange 指定队列的死信交换器
    • x-dead-letter-routing-key 指定dlx的路由键,可与延迟队列的路由键不同
  • 消息满足一定的条件会进入死信路由
    • 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。
    • 消息过期
    • 队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。
延迟队列的实现
image
  • queue1作为延迟队列,用于存储消息等到过期后转到任务队列
  • queue2作为任务队列,已经经过延迟的消息,在这里被消费

你可能感兴趣的:(RabbitMQ应用之延迟队列)