前言
说到分布式事务,大部分人都会知道ACID,两阶段提交,TCC等常见模式。 在微服务大行其道的今天,基于Saga实现的分布式事务则更具普适性。
微服务事务
微服务是将服务粒度控制在上下文内的松耦合的服务架构。对于微服务架构的事务建议对于数据库提供强一致的事务,在服务上下文之间依靠最终一致性方案来解决服务之间协同的问题。
Saga
saga是30年前的一篇数据库论文提到的概念。 论文中定义saga事务是一个长事务,整个事务可以由多个本地事务组成,每个本地事务有相应的执行模块和补偿模块,当saga事务中任意一个事务出错了,可以调用相关事务进行对应的补偿恢复,达到事务的最终一致性。
幂等
由于分布式系统中网络带来的不可靠性,saga调用服务提出了服务应该支持幂等,在服务调用超时重试情况下,不至于产生问题。
隔离性
saga事务没有准备阶段,不具备隔离性,如果多个saga事务同时操作同一资源会遇到多线程临界资源的情况,产生数据丢失或者脏数据。
为解决隔离性,可以参考TCC模式,在业务层加入session及锁机制保证操作串型化,通过业务层面达到隔离效果。
事件
saga在分布式架构下,采用事务驱动方式,让服务进行相关交互,业务方订阅相关领域事件即可。 通过事件方式降低系统复杂度,提升系统扩展性,但要注意事件循环依赖的问题。
Saga事务框架实现
组成部分:
- 服务发现模块
- 微服务处理模块
- 集中式/分布式saga协调器
- saga执行模块
saga协调器
处理saga调用请求接收,分析及执行和结果查询等内容。
执行模块根据调用图谱生成调用任务,调用微服务处理模块相关接口,如果执行出错采取补偿方法。
saga执行模块
通过分析请求的json数据,构建调用关系图谱,json用来描述saga事务串型调用子事务并执行子事务。
来源:oschina
链接:https://my.oschina.net/u/1000241/blog/3008063