Cloud- 借助消息队列解决分布式事务
转发请注明出处
前言
这次先介绍一下 RabbitMQ 的基本概念
核心概念
重要组成部分说明如下:Broker:消息队列服务进程,此进程包括两个部分:Exchange 和 Queue。(邮局部门/快递公司)Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。(邮局的快递员/快递公司快递员)Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。(收件人家的信箱/菜鸟驿站)Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到 MQ。(寄信人/寄货人)Consumer:消息消费者,即消费方客户端,接收 MQ 转发的消息。(收信人/收货人)
-----发送消息-----1、生产者和 Broker 建立 TCP 连接。2、生产者和 Broker 建立通道。3、生产者通过通道消息发送给 Broker,由 Exchange 将消息进行转发。4、Exchange 将消息转发到指定的 Queue(队列)
----接收消息-----1、消费者和 Broker 建立 TCP 连接 2、消费者和 Broker 建立通道 3、消费者监听指定的 Queue(队列)4、当有消息到达 Queue 时 Broker 默认将消息推送给消费者。5、消费者接收到消息。
工作流程
生产者将数据通过 RabbitMQ-client 发送到 RabbitMQ-server 中的 exchange,exchange 根据路由配置,分发给 Queue,消费者从 Queue 拿到数据
分布式事务的产生
多个系统相互配合工作,产生数据一致性问题。例如外卖场景中,下单中心,运单中心两个系统要配合工作,必须保证两个系统数据一致性。错误的解决方案:使用 API 接口调用,下单中心插入数据,调用运单中心的 API 接口处理数据,并启动事务回滚。咋一看这场景没有什么问题,毕竟有事务回滚,一起成功一起失败,但其实存在 API 调用超时的情况,此时下单中心以为调用失败回滚,而运单中心只是超时仍会继续执行程序,从而造成两个系统数据不一致。假设 API 调用成功,也有可能是在订单中心提交事务时失败了,此时订单中心回滚,而 API 已经调用,下单中心的数据已经产生,数据不一致。
使用消息队列解决分布式事务
问题的核心就是保证可靠生产与可靠消费可靠生产:下单中心处理数据和状态表更改应该保证事务一致。生产者往消息队列发送数据时,在本地建立一张状态表,看是否成功发送给队列。利用 RabbitMQ 的确认机制看是否重发还是定时扫描状态表重发,保证可靠生产。兜底方案还是定时扫描状态表。代码
/**
分单处理队列*/public static final String QUEUE_NAME_TRAN 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 SACTION = "xucheng.distribute.queue";
/**
分单处理交换机*/public static final String EXCHANGE_NAME_TRANSACTION = "xucheng.distribute.exchange";
/**
消息队列服务进程,此进程包括两个部分:Exchange 和 Queue。*/public static final String ROUTE_NAME_TRANSACTION = "xucheng.distribute.route";
/**
补单队列*///public static final String CREATE_QUEUE_NAME_TRANSACTION = "xucheng.order.reCreate.queue";
评论