本地事务异步恢复机制实现多数据源最终一致性

在传统关系型数据库的事务模型中必须遵守ACID原则,在单数据库业务下,ACID模型有效保障了数据的完整性,但是在大规模分布式环境下,一个业务往往会跨越多个数据库,如何保证这多个数据库之间的数据一致性,在JavaEE规范中使用2PC两阶段提交来处理跨DB环境下的事务问题,这套规范叫JTA,但是2PC是反可伸缩模式,事务处理过程中,参与者需要一直持有资源直到整个分布式事务结束,当业务规模达到千万级,2PC的局限性就越明显,系统伸缩性变得极为困难。

基于此,支付宝自己实现了一套类2PC的分布式事务方案,采用了类似BASE的思想,BASE模型反ACID模型,牺牲高一致性,获得可用性或可靠性,其最大的特点就是最终一致(Eventually consistent),最终数据是一致的就可以了,而不是实时高一致。

这套思路核心是异部恢复,如果不使用分布式事务中间件,也可以在本地系统通过适当的业务编排和异步恢复实现。需要服务的提供方支持对称接口,比如支付和退款。

请求状态机为:INIT(初始状态),SUCCESS(成功),FAIL(失败)

系统生成的每笔请求都是唯一的,INIT状态支付请求关联的退款请求状态只可能是INIT或SUCCESS(因为外部发起的退款必须原支付成功,系统内部设生成的退款请求是为了撤回状态未知的原支付请求,支付处理异常从用户角度看作失败,所以对应的撤回操作必须成功)

示例如下:

本地事务异步恢复机制实现多数据源最终一致性_第1张图片



你可能感兴趣的:(数据库,事务,任务调度)