RabbitMQ延时队列实现分布式事务的最终一致性方案

应用场景:大型电商订单支付

消息的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队列

消费者监听这个队列就能获取到消息

 这样就实现了一个简单的通过死信队列来达到延迟消息的效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值