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

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

RabbitMQ延时队列实现分布式事务的最终一致性方案_第1张图片

消息的TTL(Time To Live)RabbitMQ延时队列实现分布式事务的最终一致性方案_第2张图片

 死信路由Dead Letter Exchanges(DLX)

RabbitMQ延时队列实现分布式事务的最终一致性方案_第3张图片

延时队列实现1 

RabbitMQ延时队列实现分布式事务的最终一致性方案_第4张图片

生产者发送消息给交换机 携带路由键deal.message

交换机将其转发给delay队列  无人监听这个队列

该队列设置消息存活时间是5分钟 到期转发给指定的路由件delay.exchange 消息的key是delay.message

delay交换机接受到消息后继续转发给与其绑定的test队列

消费者通过监听test队列,就可以获得这个消息

这样就成功设置了5分钟延迟的队列消息

延时队列实现2

RabbitMQ延时队列实现分布式事务的最终一致性方案_第5张图片

生产者发送一个设置了5分钟过期的消息给死信路由

无人监听该死信路由,等消息过期了将其转发给delay交换机

delay交换机将消息发送到test队列

消费者监听test队列获得消息

推荐使用第一种方案给队列设置过期时间,因为rabbitMQ采用的是惰性检查机制 如果使用第二种模式让消息自己过期就会出现以下情况:

发送三条消息 分别A 5分钟过期 B 1分钟过期 C 1秒过期 顺序进入队列

rabbitMQ检查第一个消息A为5分钟后过期就等5分钟后再来转发 导致后面的B C消息即使过期了也阻塞在队列中,等下次rabbitMQ将A转发后才能被立马转发出去 导致时间精确问题

延迟队列案例实战

RabbitMQ延时队列实现分布式事务的最终一致性方案_第6张图片

 业务逻辑:

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属性类

RabbitMQ延时队列实现分布式事务的最终一致性方案_第7张图片

定义两个 队列

RabbitMQ延时队列实现分布式事务的最终一致性方案_第8张图片

 定义交换机以及绑定两个队列

RabbitMQ延时队列实现分布式事务的最终一致性方案_第9张图片

运行 交换机和队列都创建成功

RabbitMQ延时队列实现分布式事务的最终一致性方案_第10张图片

 发送消息 

 RabbitMQ延时队列实现分布式事务的最终一致性方案_第11张图片

死信队列收到消息  1分钟后会将消息转回给交换机 交换机将其发给order.release.queue队列

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

RabbitMQ延时队列实现分布式事务的最终一致性方案_第12张图片

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

你可能感兴趣的:(分布式事务,java-rabbitmq,rabbitmq,分布式)