摘要:CAP 理论中的强一致性与可用性的告诉我们两者不可兼得,并由此催生出了 BASE 理论,将强一致性和可用性弱化为最终一致性和基本可用性。本文主要叙述笔者对最终一致性实现的理解,希望对大家有帮助。
1 - 分布式事务
在单机应用上,我们使用事务是很方便的,因为所有的业务逻辑都在本地,数据库事务就能解决 ACID 问题,特别是使用一些J2EE的框架,每一层的业务逻辑都给我们安排得妥妥当当的。
当系统已经被拆分部署到多个服务器实例上时,一般每个服务器都只负责维护一个子系统一张/数张表。与单机相比,业务还是那个业务,但从直接调用本地的下层服务变成了一个远程的RPC调用。
在分布式环境下,一个远程调用是不可靠的(因为网络是不可靠的),我们无法保证在一台服务器上发出的请求一定能在另一台服务器上执行成功,也无法保证执行结果能够准确/准时地返回。有可能被调用的服务执行失败,也有可能执行成功,只是报文丢失。因此导致数据不一致,这些实际上也是分布式事务的问题。
常见的分布式事务方案有:
- 两阶段提交
- TCC(Try/Confirm/Cancel)
- 消息事务+最终一致性
可以参考这篇高点击率文章——高并发下分布式事务的解决方案,文章篇幅较短,但比较全面,可以简单了解这几种方案。
下面会介绍“消息事务+最终一致性”的分布式事务方案,给出我们设计阶段的细节流程供大家参考。