应用场景:大型电商订单支付
消息的TTL(Time To Live)
死信路由Dead Letter Exchanges(DLX)
延时队列实现1
生产者发送消息给交换机 携带路由键deal.message
交换机将其转发给delay队列 无人监听这个队列
该队列设置消息存活时间是5分钟 到期转发给指定的路由件delay.exchange 消息的key是delay.message
delay交换机接受到消息后继续转发给与其绑定的test队列
消费者通过监听test队列,就可以获得这个消息
这样就成功设置了5分钟延迟的队列消息
延时队列实现2
生产者发送一个设置了5分钟过期的消息给死信路由
无人监听该死信路由,等消息过期了将其转发给delay交换机
delay交换机将消息发送到test队列
消费者监听test队列获得消息
推荐使用第一种方案给队列设置过期时间,因为rabbitMQ采用的是惰性检查机制 如果使用第二种模式让消息自己过期就会出现以下情况:
发送三条消息 分别A 5分钟过期 B 1分钟过期 C 1秒过期 顺序进入队列
rabbitMQ检查第一个消息A为5分钟后过期就等5分钟后再来转发 导致后面的B C消息即使过期了也阻塞在队列中,等下次rabbitMQ将A转发后才能被立马转发出去 导致时间精确问题
延迟队列案例实战
业务逻辑:
1.生产者下单服务发送一条消息给order-event-exchange 携带路由键为order.create.order
2.order-event-exchange将这条消息立马转发给order.delay.queue队列
3.order.delay.queue这个队列中的消息存活时间是1分钟 并且设置消息过期了转发的路由是order-event-exchange,携带的路由键是order.release.order
4.order-event-exchange接受到路由键为order.release.order的消息就会将其转发给order.release.order.queue队列 消费者会监听这个队列获取消息
注意:rabbitMQ只要生成队列,修改配置属性 重启项目 配置发生变化也无法覆盖 建议删除重新生成
封装rabbitMQ属性类
定义两个 队列
定义交换机以及绑定两个队列
运行 交换机和队列都创建成功
发送消息
死信队列收到消息 1分钟后会将消息转回给交换机 交换机将其发给order.release.queue队列
消费者监听这个队列就能获取到消息
这样就实现了一个简单的通过死信队列来达到延迟消息的效果