-
调用系统C的短信服务,发送短信
-
更新短信发送记录为已发送
退款补偿Job 查询退款记录表中处理中的记录,调用系统B的退款服务 退款成功处理:
-
新增短信发送记录,记录状态为待发送
-
调用系统C的短信服务,发送短信
-
更新短信发送记录为已发送
短信通知补偿Job 查询短信发送记录中待发送的记录,调用系统C的短信服务
-
调用系统C的短信服务,发送短信
-
更新短信发送记录为已发送
注意:
-
系统B和系统C需要根据调用方传的uuid支持幂等
-
系统A、B、C会出现短暂的不一致,但最终一致
事务消息
可以将其视为两阶段提交消息实现,以确保分布式系统中的最终一致性。事务性消息可确保本地事务的执行和消息的发送可以原子方式执行。
但是由于事务消息异步的特性,调用方拿不到消费方的处理结果,适用于不关心对方的返回结果/对方负责保证处理成功
针对上述场景,增加两个事务消息的方式解决一致性问题,系统A通过发送事务消息的方式与系统B和系统C进行交互
具体实现过程:
-
发送退款的事务消息
-
新增退款记录,状态为:处理中
-
Commit退款事务消息
提供MQ事务callback
退款callback查询
-
有退款记录且为处理中则Commit
-
其他则Rollback
发送短信callback查询
-
有退款记录且成功则Commit
-
其他则Rollback
退款同步Job
查询退款记录表中处理中的记录,调用系统B的退款查询接口 同步状态 其中退款成功处理:
-
发送短信的事务消息
-
更新退款记录为成功
-
Commit短信事务消息
相关理论
二阶段提交
二阶段提交是解决分布式事务问题的重要理论基础,但也存在着明显的问题:
-
阻塞问题,参与者将协议消息发送给协调器后,它将阻塞直到收到提交或回滚,只能依赖协调者的超时机制
-
协调者单点问题,如果协调者出现故障,则某些参与者将一直无法收到提交或回滚的消息。
为了解决二阶段提交出现的问题,又有了三阶段提交(Three-phase commit):
-
解决阻塞问题:将2PC中的第一阶段一分为二,提供了一个CanCommit阶段,此阶段并不锁定资源,这样可以大幅降低了阻塞概率
-
解决单点问题:在参与者这边也引入了超时机制
DTP Model
X / Open分布式事务处理DTP(Distributed Transaction Processing)模型是一种软件体系架构,已经成为事实上的事务模型组件的行为标准。它允许多个应用程序共享由多个资源管理器提供的资源,并允许其工作被协调为全局事务。
ApplicationProgram(AP) 应用程序定义了事务边界并指定构成事务的操作
ResourceManager(RM) 资源管理器用来管理我们需要访问的共享资源,我们可以将它理解为关系数据库、文件存储系统、消息队列、打印机等
TransactionManagger™ 事务管理器是一个独立的组件,他为事务分配标识符并监视事务的执行情况,负责事务完成和故障恢复
CommunicationResourceManager(CRM) 通信资源管理器控制一个或多个 TM domain 之间分布式应用的通信。
XA Specification
XA规范是X/Open关于分布式事务处理 (DTP)的规范。规范描述了全局的事务管理器与局部的资源管理器之间的接口。XA规范的目的是允许多个资源(如数据库,应用服务器,消息队列,等等)在同一事务中访问,这样可以使ACID属性跨越应用程序而保持有效。XA使用两阶段提交来保证所有资源同时提交或回滚任何特定的事务。
XA规范描述了资源管理器要支持事务性访问所必需做的事情。
TCC
saga
在 Saga 模式下,分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。
分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交。如果任何一个正向操作执行失败,那么分布式事务会去退回去执行前面各参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务回到初始状态。
Saga 模式下分布式事务通常是由事件驱动的,各个参与者之间是异步执行的,Saga 模式是一种长事务解决方案。
Saga模式的优势是:
-
一阶段提交本地数据库事务,无锁,高性能;
-
参与者可以采用事务驱动异步执行,高吞吐;
-
补偿服务即正向服务的“反向”,易于理解,易于实现;
缺点:
- Saga 模式由于一阶段已经提交本地数据库事务,且没有进行“预留”动作,所以不能保证隔离性。
开源项目
seata
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。支持AT、TCC、SAGA、XA四种模式,对微服务框架支持友好。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
福利**
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
[外链图片转存中…(img-Ptk488iS-1712694013028)]
[外链图片转存中…(img-C7gRSs01-1712694013029)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-FTd1snV4-1712694013029)]