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的转账状态为例 , 我们把两个账户的转账情况粗分为四个状态:
- 第一个状态为准备状态 , 用户准备向另外一个进行用户转账;
- 第二个状态为扣额状态 , 系统将从转账用户中扣取相应余额;
- 第三个状态为加额状态 , 系统将从收款用户中增加相应余额;
- 第四个状态为完成状态 , 系统转账完成后的确认;
- 无边界办公——WebDAV文件共享服务构建
- 苹果服务业务也赚钱:第四季度仍将保持两位数增速
- Nginx服务器屏蔽与禁止屏蔽网络爬虫的方法
- 阿里云数智服务创新挑战赛落幕 南京大学夺冠
- 企业建站使用服务器好还是虚拟主机好?
- 买手机不能忽视售后,OPPO贴心打造“无忧式”服务
- 手把手教你AspNetCore WebApi:Serilog
- 天上不会掉馅饼,马云开始“收网了”,此前免费服务如今开始收费
- 拉勾许单单:招聘的未来是从信息黄页模式到服务模式
- 物联网行业,如何正选的选择服务器解决方案?