什么是分布式系统
说分布式事务之前不得不说下什么是分布式系统
分布式系统是通过分布在不同互联的计算机上的程序来协作完成业务的一个系统
说分布式事务前不得不提下分布式系统的八大谬论
1 网络是可靠的
2 延时是零
3 带宽是无限的
4 网络是安全的
5 拓扑是不会表的
6 存在一个管理员
7 传输是零开销的
8 网络是同质的
随着微服务的流行,很多时候我们需要多服务配合来完成一个业务行为,比如下图

对于用户来说,这个业务行为包含入口服务和abc四个服务的操作,必须作为一个完整的事务来完成,否则就是有问题的,这个就叫做分布式事务.
但如上分布式系统的八大谬论来说,没办法理论上100%保证入口服务和abc同时成功,也就是故障必然是有存在的,那么如何解决这个问题呢
三 怎么解决分布式事务问题
1 异步补偿型
正常模式
1) 入口服务被调用后把操作计入事件表
2) 执行本地事务和abc调用
3) 如果2)成功了则进入4),如果2)失败了则进入内存eventbus走异步
4) 重试直到更新事件状态成功
异常恢复
1) 引入一个事件处理进度表
2) 重启恢复后从事件处理进度表中获取处理处理进度
3) 进行事件处理
4) 成功则更新事件处理进度,失败则继续3
注意点:
1 事件与事件必须唯一性区分
2 引入事件处理进度表减少异常恢复的时间
3 同步+内存eventbus异步 减少事件处理到用户可见的时间
4 下游服务必须做了幂等性处理
2 引入支持事务消息的消息中间件
1) 开启事务消息
2) 执行本地事务
3) 提交事务消息
如果消息中间件没有收到提交动作,会主动询问事务状态,如果已完成,那就任务此消息有有效的,可以给消费端消费
3 tcc demo
比如依赖abc服务
正常模式
1) 在事件表内记录事件,标识为初始状态
2) 调用abc的try接口(锁定业务需要的资源)
2.1) 失败则进入3
2.2) 成功则进入4
3) 调用abc的cancel接口
3.1) 成功则重试更新事件状态canceled直到成功,然后结束
3.2) 失败则进入内存eventbus异步,成功后进入3.1
4) 调用abc的confirm接口
4.1) 成功则重试更新事件状态confirmed直到成功,然后结束
4.2) 失败则进入内存eventbus异步,成功后进入4.1
异常恢复
1) 引入一个事件处理进度表
2) 重启恢复后从事件处理进度表中获取处理处理进度
3) 进行事件处理
3.1) 如果状态是初始状态,则进行cancel,进入4
3.2) 如果状态是tried,则进行confirm,进入4
4) 成功则更新事件处理进度,失败则继续3
注意点:
1) 被调用方需要处理空cancel的问题(也就是收到try操作,需要记录操作,防止空cancel)
2) 被调用方需要处理资源悬挂的问题(对于cancel操作记录一条操作,那么迟到的try操作就会失败)
- saga
跟上面tcc处理方式类似,没有了try操作,提供的是2个正反向的操作(比如加钱和扣钱)
也同样需要处理空cancel和资源悬挂问题
- seata
seata已经集成了tcc,saga,at等模式,可以尝试使用