缘起
现在用的比较多的分布式事务方案主要有TCC和可靠消息。TCC需要对业务进行改造,分别实现try/confirm/cancel方法,侵入性太强,工作量大。而可靠消息主要适合可以异步调用的业务,对于需要跨服务同步调用的业务,实现困难。以订机票为例,从深圳->新疆乌鲁木齐,假设没有直达,第一步先要确定中转地,选择一家航空公司订票,假设这步的订票结果是成功调用南航的服务订到了深圳->西安,那第二步调用就要根据第一步的结果订第二张票,比如优先选择同一家航空公司,间隔时间要大于两小时,出发地要限制在西安。如果第二步订票失败,那么第一步订的票也需要回滚。像这种存在上下文逻辑关系的跨服务调用,用消息同步方案很难处理。
所以需要一个好的支持跨服务调用的分布式方案。
理想实现
1) 简洁明了,最好和普通的无事务或一阶段事务的远程调用相接近
2) 侵入性小,尽量不要因为引进分布式事务引起业务代码结构的明显变化
3) 危险期短
4) 性能损失少
现实情况
TCC方案满足条件3,4,条件1勉强,不满足条件2。
Atomikos方案貌似也比较流行,但有很多限制。比较奇怪的是网上的例子基本上是用Atomikos实现基于XA的单例多数据源的事务控制,看不到跨服务调用的例子。官方倒是提供了各种场景的使用例子,看了后,我猜到了原因:官方的例子很不清爽,而且高性能方案要收费。我在测试的时候发现免费版限制了50个事务/每秒,就直接放弃了对它的进一步研究。
我最满意的方案是阿里的GTS,它是基于XA的两阶段提交,使用时只要一个注解和