场景举例:订单生单成功后,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作为任务队列,已经经过延迟的消息,在这里被消费
网友评论