分布式事物 - 基于RPC调用 - 补偿模式

前提

  • 所有服务均有独立的事物管理机制,相互间没有任何关联.
  • 所有业务接口都有对应的补偿方法,用于将已经更新的数据还原到上一次的状态.
  • 本次实例为同步业务,理想状态下,只有全部成功或全部失败两种情况.

正式开始

正常流程

一切安好.

中途异常 - 补偿成功

虽然发生了失败,但所有补偿都成功了.没有什么问题

中途异常 - 补偿失败

此时,主服务有三种处理方法

  1. 主服务无限重试补偿方法,直到补偿成功.
    这里有很麻烦的问题,如果下游的服务器已经停机,此时主服务的无限重试已经没有意义.在最坏的情况下,如果主服务访问量过大,而因为业务相同,主服务的线程池中的全部线程将全部处于阻塞状态,失去处理新请求的能力.
    同时,访问主服务的客户端有可能会放弃本次的连接,导致正在重试中的线程被回收,丢失所有状态
  2. 主服务尽可能调用补偿方法,并回滚自身事物,同时通知备用方案
    这里依靠备用方案对失败的补偿调用进行异步异步调用,已达到"最终一致"的效果.备用方案一般需要集成"可靠消息系统"
  3. 主服务直接放弃补偿与自身的回滚,并通知备用方案
    与2基本相同.在调用链比较长的情况下且补偿随机性失败,从上层看,2方案的调用结果(备用方案未执行时)将成锯齿状.而本方案,其对应
    的消费者直接以级联方式进行补偿的调用,最终完成全部补偿调用与主方法数据回滚,同样从上层看,方案3的调用结果(备用方案未执行时)将是平整的(只有失败处断裂).

方案1直接pass
方案2,3可以使用消息队列与对应的消费者进行实现.但是会有短暂的数据不一致问题

中途异常(伪) - 触发补偿

这种情况具体描述如下

  1. 正常远程调用
  2. 下游业务接收并进行处理
  3. 主服务认为网络超时(如等待数据库锁释放)或发生其他意外,从而触发补偿流程
  4. 下游业务完成请求处理
  5. 主服务发起并执行补偿流程(不包含4涉及的服务)

解决方法

  1. 记录全局唯一识别码,当主服务发起补偿时,所有下游业务应该得知,并出发各自的补偿方法.
  2. 需要注意,在尝试解决过程中,如果主服务过早推送回滚通知,涉及独自提交的服务早于对应业务处理完成进行补偿,将会导致回滚通知失效.

在这种情况下,上游业务回滚,下游业务独自完成了业务处理,造成数据问题. 会有短暂的数据不一致问题
同样的,在这种情况下,调用补偿也有可能发生调用失败的情况.并且会更复杂,因为此时主服务会发出全局的回滚消息,需要处理补偿消息与回滚消息的顺序问题

主服务断电 - 正常运行,补偿中,补偿失败中

此时主服务状态全部丢失且下游业务状态错乱

只能借用可靠消息对进行中的操作进行记录,并在再次开启后进行恢复

总结

  • 在必须要使用RPC进行远程调用且事物复杂的情况下,应使用一个可靠的消息系统保证在各方断电,断网,回滚时能够即使恢复"状态".
  • 同时,应保证严格的幂等性,对于非幂等消息,根据实际情况,进行保留会消耗.
  • 所有经由消息系统的恢复性调用,均为异步操作,此时各方数据会出现不同步的问题.
  • 对于复杂性,即使是只有2步,也会产生意外,且补偿方法并不可靠.必须使用"可靠消息"系统进行保证(就是说,不要想要有"方便"这两个字).
  • 对于调用消息,进行两步验证,要做xxx与完成xxx,同时保证复苏用的业务数据即可.对于全局回滚消息,进行通用,同时保证复苏消息与回滚消息的幂等
  • 主服务自身的业务逻辑也应做成远程调用的模式,即有常规与补偿方法.而主方法本身不包含事物,以此进行统一管理
  • 基于上述的内容,已经很靠近TCC模式了,且需要扩展很多框架级代码与补偿代码.
(0)

相关推荐

  • 基于有限状态机与消息队列的三方支付系统补单实践

    0.引言 在日常生活中,从线下的超市购物到线上的外卖点餐.电商网购等,支付无时无刻不在发生,不论是通过现金.pos 机刷卡还是微信支付宝等第三方支付.线上支付有着及时便捷一气呵成的极致体验,当然也有少 ...

  • 分布式事务最经典的七种解决方案!

    优质文章,第一时间送达 随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构.随之而来就必然遇到分布式事务这个难题,这篇文章总结了分布式事务最经典的解决 ...

  • 架构杂谈《五》

    保证最终一致性的模式 在大规模.高并发服务化系统中,一个功能被拆分成多个具有功能单一的子功能,一个流程会有多个系统的多个单一功能的服务组合实现,如果使用两阶段提交协议和三阶段提交协议,确实能解决系统间 ...

  • 不懂分布式事务,别说你懂微服务!

    回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后端圈」 1. 传统应用的事务管理 1.1 本地事务 再介绍微服务下的数据一致性之前 ...

  • 分布式事物 - 基于RPC调用 - TCC模式

    前提 前端业务(主服务)可以以同步或异步调用TCC框架,或者TCC框架本身就是同步异步兼备的. 假定TCC框架拥有断电后的自动恢复能力.同时,在下游业务出现无限失败的情况下,也会进行无限的重试,以达到 ...

  • 基于显著增强多模式池的图像成分评估

    重磅干货,第一时间送达 小黑导读 论文是学术研究的精华和未来发展的明灯.小黑决心每天为大家带来经典或者最新论文的解读和分享,旨在帮助各位读者快速了解论文内容.个人能力有限,理解难免出现偏差,建议对文章 ...

  • 为什么说基于微信的销售模式比直销更容易做?

    不盲目崇拜任何新模式,我们最终追求的就是获客成本趋近于0. 任何新商业模式的产生,都会引起人盲目跟风. 没有搞清楚模式的本质,盲目跟风最终也只是炮灰,像5年前火的不行的 o2o现在已经没有几家公司活下 ...

  • 关于 webassebmly Blazor RPC 调用

    离开了园子很久很久了 疫情期间,没有办法出差,正好当前时间是自己规划的查漏补缺时间,把缺少的Web模块的统计分析图表加进去 Webassembly 老早是听说了,但由于项目的原因,也一直没有精力去关注 ...

  • 一次跨行取款失败,而引发对分布式事物的思考

    场景 不知道大家有没有遇到这样的情况,就是去自动取款机取钱的时候,比如说你去取1000块钱,这个时候系统会先帮你把1000块钱扣除,然后自动取款机再把钱吐出来.但是如果取款机出现问题,会发现钱被扣了, ...

  • 【速记】朋友圈中的小知识:什么是分布式光伏的“集中汇流”开发模式?

    据介绍,"集中汇流"是一种专业光伏开发模式,指的是以全村集中商业模式安装光伏上网,不是以自然人单户安装光伏上网.伴随着张家庙村第一块大海光伏组件上架安装,标志着山东省首个" ...

  • 累计100亿英里驾驶数据,Zendrive如何切入基于UBI的车险模式?

    保观|专注互联网保险 Zendrive是一家汽车数据公司,从2013年成立以来,迅速成长为了驾驶分析领域覆盖范围最广.增长最快的公司之一.本篇文章从业务模式.数据收集.团队融资等方面解析Zendriv ...

  • 基于比例增益补偿的永磁同步电机转速平滑控制

    摘要 天津大学电气自动化与信息工程学院.天津市电机系统先进设计与智能控制技术工程中心(天津工业大学)的研究人员刘宁.夏长亮,在2018年第17期<电工技术学报>上撰文指出,在永磁同步电机驱 ...

  • 一种基于故障模型的补偿电网接地综合选线装置

    摘要 中山职业技术学院机电工程学院.信阳供电公司检修公司的研究人员陈忠仁.朱明军等,在2019年第1期<电气技术>杂志上撰文指出,由于消弧线圈的接入,补偿电网改变了电网的电气特征量的性质, ...