理论
- CAP 定律,最终一致性
- Base 理论
- 基于XA协议的两阶段提交
- FLP(FLP Impossibility Result 不可能性) :在异步通信场景,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性!
- 共识算法
- 事务传播机制
- 事务隔离性
解决方案
- XA重量级
- 基于可靠消息的最终一致性方案
- TCC
- Saga
注意事项
基本上,每个人刚开始建立一个分布式系统时,都做了以下 8 条假定。随着时间的推移,每一条都会被证明是错误的,也都会导致严重的问题,以及痛苦的学习体验。
- 网络是稳定的。
- 网络传输的延迟是零。
- 网络的带宽是无穷大。
- 网络是安全的。
- 网络的拓扑不会改变。
- 只有一个系统管理员。
- 传输数据的成本为零。
- 整个网络是同构的。
相关技术
接口幂等性
参考实现方案:
- 前置条件:数据变更操作都有唯一业务流水号
- 判断redis中是否有业务流水号
- 如果有则拒绝,请求结束;如果没有,则插入流水号,执行业务
- 如数据量过大,可考虑定期清理过期数据
- 补充:业务流水号也可以设计成有序的,便于在大数据中使用二分查找、跳查表
分布式系统时钟
分布式系统中如何设置系统时钟,以及进程间的通讯机制,在没有任何共享时钟的情况下,如何确定一个事件发生在另一个事件之前
- Lamport 时钟:居然还和相对论有关;阻塞算法
- Vector 时钟
实现最终一致性有三种模式
- 可靠事件模式
- 业务补偿模式
- TCC模式
执行顺序
如果我们先后收到两条事件,(1)账户余额更新为100,(2)账户余额更新为120。
如果事件不是在同一个服务器上发出的,那么服务器之间的时间同步是个难题,更稳妥的做法是使用一个全局递增序列号替换时间戳。
框架
- 阿里GTS
- 阿里分布式事务框架GTS开源啦!
- GTS开源版:Fescar;2019年4月已更名为seata
- TX-LCN分布式事务框架
框架对比
框架总结
从开发团队背景上看seata胜出,但是seata需要使用dubbo,并且现在处于开发完善阶段(频繁的修复bug提交记录),不建议用于生产环境。
参考资料
- “分布式事务一致性” 看这一篇就够了
- 保证分布式系统数据一致性的6种方案
- ACK机制
- 为什么说分布式事务不再适用于微服务架构
- 左耳朵耗子推荐:分布式系统架构经典资料
- 《分布式系统原理与范型(第2版)》(世界著名计算机教材精选)
- 可扩展的Web架构和分布式系统
- Raft 一致性算法论文译文
- Raft算法动态演示 The Secret Lives of Data
- Raft算法动态演示 Raft Distributed Consensus Algorithm Visualization
- Raft算法动态演示 The Raft Consensus Algorithm
- Gossip动画演示 gossip-visualization
- Spanner 是 Google 的全球分布式数据库 Globally-Distributed Database
- 基于Spanner论文的开源实现 :出自Google公司自己的人CockroachDB;国人作品TiDB