最近的工作主要是微服务框架的设计与开发,期间要解决多个微服务的分布式事务问题,由于要解决的主要场景是用spring boot写的java项目,最终选择了业界成熟的servicecomb-saga方案,这里稍微记录下以备忘。
为何会有分布式事务
这里不作深入叙述,网上有相当好的参考资料-聊聊分布式事务,再说说解决方案。
为何选择saga方案
两阶段提交方案实现较复杂,而且对性能影响太大;
TCC方案好像只有阿里内部在大规模使用;
本地消息表方案消息表会耦合到业务系统,不太优雅;
MQ事务消息方案依赖于有事务消息的MQ中间件。
最后好像也只好选择saga方案,另外有了servicecomb-saga后,spring-boot应用要使用分布式事务还是挺容易的。
servicecomb-saga的架构
servicecomb-saga的架构可直接参考其官方文档,写得还是比较详细的。
概览
Pack中包含两个组件,即 alpha 和 omega。
alpha充当协调者的角色,主要负责对事务的事件进行持久化存储以及协调子事务的状态,使其得以最终与全局事务的状态保持一致。
omega是微服务中内嵌的一个agent,负责对网络请求进行拦截并向alpha上报事务事件,并在异常情况下根据alpha下发的指令执行相应的补偿操作。