NET Core微服务之路:再谈分布式系统中一致性问题分析( 三 )
但是 , 我们就Q2假设另外一个场景 , 假设账户的数量巨大 , 对账户存储进行了拆分 , 关系型数据库分为8个实例 , 每个实例8个库 , 每个库8张表 , 共512张表 , 假如转账的账户正好在一个库里 , 这个问题依赖关系型数据库的事务来保持强一致性 , 但是 , 如果两个账户在不同的库里 , 这个事务就无法封装在同一个数据库中的 , 这样就会发生一个账户扣款成功 , 而另外一个库的账户增加失败的情况 。
这时 , 我们就需要考虑另外一种理论:CAP理论和BASE理论 , 就CAP原文可参考百科 。 而BASE原文可参考百科 。
帽子理论证明 , 任何分布式系统同时只可满足两点 , 没法三者兼顾 。
- C:Consistency , 一致性, 数据一致更新 , 所有数据变动都是同步的
- A:Availability , 可用性, 好的响应性能 , 完全的可用性指的是在任何故障模型下 , 服务都会在有限的时间处理响应
- P:Partition tolerance , 分区容错性 , 可靠性
文章插图
而BASE理论的提出 , 解决了CAP在分布式系统中的一致性和可用性不可兼得的问题 。 “BASE”在化学单词中是指碱 , 因此我们可以想到一个词语叫“酸碱平衡” , 而在实际的场景中 , 我们可以分别使用ACID和BASE来解决分布式服务化系统的一致性问题 。 BASE理论与ACID理论完全不同 , 它满足CAP理论 , 通过牺牲强一致性而获得可用性 , 一般应用在服务化系统的应用层 , 通过达到最终一致性来尽量满足不同业务上的需求 。
- BA:Basically Available , 基本可用
- S:Soft State , 软状态 , 状态可以有一段时间不同步
- E:Eventually Consistent , 最终一致 , 最终数据是一致的就可以了 , 而不是时时保持强一致
文章插图
按照BASE模型实现的系统 , 由于不保证强一致性 , 系统在处理请求的过程中 , 可以存在短暂的不一致状态 。 系统在做每一步操作的时候 , 通过记录每一个临时状态 , 在系统出现故障的时候 , 可以从这些临时状态中继续完成未完成的请求处理 , 或者回退到原始状态 , 最后达到一致的状态 。
例如Q1的转账状态为例 , 我们把两个账户的转账情况粗分为四个状态:
- 第一个状态为准备状态 , 用户准备向另外一个进行用户转账;
- 第二个状态为扣额状态 , 系统将从转账用户中扣取相应余额;
- 第三个状态为加额状态 , 系统将从收款用户中增加相应余额;
- 第四个状态为完成状态 , 系统转账完成后的确认;
推荐阅读
- 亚马逊终止托管服务:Parler网站下线
- Git服务器配置错误导致日产汽车源码在网上泄露
- 虾米音乐,下个月正式停止服务
- 虾米音乐播放器将于2月5日停止服务,今开启用户资产处理通道
- 服务|虾米音乐:2月5日关停3月5日后将无法登录
- 天猫精灵App全新升级,推出“精灵家”服务
- 快递员拒绝送货上门并大喊大叫!经济学者马光远吐槽德邦快递服务烂:流氓至此,坚决抵制
- 亚马逊宣布停止为Parler提供托管服务
- 亚马逊员工权益组织呼吁AWS拒绝为Parler提供托管服务
- 普渡机器人获最佳商用服务机器人奖