NET Core微服务之路:再谈分布式系统中一致性问题分析

一致性:很多时候表现在IT系统中 , 通常在分布式系统中 , 必须(或最终)为多个节点的数据保持一致 。 世间万物 , 也有存在相同的特征或相似 , 比如儿时的双胞胎 , 一批工厂流水线的产品 , 当然 , 我们不去讨论非IT以外的知识点 。
注:我们一定要明白一个词叫“信息不对称” , 不论是人、事、物 , 信息不对称是永远都存在的 , 要知道 , 在IT系统中 , 能引起信息不对称的因素有很多 , 比如网络上 , 有丢包、有延迟 。 硬件上 , 有不同性能的计算能力和处理能力 。
在传统的IT时代 , 一致性通常是指强一致性 , 比如一个单体的WEB程序中 , 从数据库到缓存 , 再到呈现出来的界面 , 数据均是相同的;
而在现在的互联网时代 , 特别是分布式架构下 , 一致性的含义远远超出她原有的含义 , 由于互联网的特点 , 信息量巨大 , 每个人(或者不同的每个业务)获取到的信息不对称 , 最终都会造成不一致 。
换句话说 , 传统的单体应用无法满足巨大的信息量 , 而转向为多节点、多服务的分布式架构模型(正如CPU , 从单核变为多核来支撑更多的计算能力) , 多个服务多节点必然会产生数据不一致的问题 , 正如虽然人多力量大 , 可如果每个人都往不同方向使劲 , 这个力量就是分散的 , 不一致的 , 没有任何作用的 , 所以 , 我们需要管理 , 需要告诉每个人使劲的方向 , 告诉每个人的排列顺序等等一系列有效的分配和管理 , 于是乎 , 我们将这个话题转化为互联网思维就是“拆”(非拆迁办) 。
我们很多时候都在讨论这个程序如何拆分 , 比如拆成业务层、数据层、提供层、UI层、缓存层等等 , 而每一层的部署大部分情况下都不会存在于一个相同的宿主中(否则怎么还叫拆) , 这样称为水平拆分(或横向拆分) , 将这些不同的层部署成多个节点 , 多个节点如果具有相同的一致性功能 , 那么再组成一个服务域 , 这样 , 把这个服务域作为一个处理中心 , 在处理能力和计算能力上 , 远远会超过单体程序的整体性能 。
这样的优势显而易见 , 但是 , 最大的问题(不能说是缺点)是 , 由于拆分后的系统或者服务化的系统 , 存在多个元功能模块 , 或者一个服务域中的多个节点 , 如何去保证它们数据的一致呢?
NET Core微服务之路:再谈分布式系统中一致性问题分析文章插图
提出问题直接用A,B,C等等常规化表述形式去描述不一致问题 , 网上文章很多 , 我们尝试换一种方式 , 以实际的、你我都会接触到的现实场景 , 来理解不同情况下所产生的不一致问题 。
Q1.生活案例:意愿
假如 , 别假如了 , 就拿笔者来说吧 。 当初跟妻子去买婚戒的时候 , 只想买个一般的对戒便可 , 因为日后的日子里用钱的地方太多(相信任何一个已婚男士都有这种体会) , 可妻子喜欢那种布灵布灵的 , 要知道 , 这种布灵布灵的 , 可比一般的要贵出许多许多 , 那么 , 这个不一致就开始形成了 , 你的意愿和她的意愿并没保持一致 , 日后生活问题会越来越大 。 当然 , 这只是一个几年前的例子 , 显然我妻子已经接受了我当初的观点 。
Q2.银行案例:转账
转账是不一致案例中最经典的例子 。 这么来说 , 假如你想通过某个平台 , 比如支付宝、微信、银行进行转账 , 这个平台的流程是这样的:首先减去你账户上的余额 , 然后加到你指定账户上去 。 如果平台减去你的账户余额成功了 , 而增加其他账户的的余额失败了 , 那么你将损失这笔钱;如果减去你的账户余额失败 , 而增加其他账户的余额成功 , 那么银行将损失这笔钱;这种资金上的不一致是绝不允许存在 , 否则这个平台将面临破产和倒闭 。
Q3.常见案例:下单和扣库存
不管是电商还是企业仓库 , 都会存在一个经典案例 。 比如 , 你在某个界面上进行了下单 , 比如她显示的库存是100件 , 而你订购了1件 , 并支付了应该的费用 , 可是 , 这个库存数量并未任何变化 , 那么 , 如果有101个人前来购买 , 那么会出现超卖的情况 , 也就是这多出来的1个人将买不到这件商品 , 这就是下单和库存不一致所导致的 。 反之 , 永远下单不成功 , 而库存却在减少 , 这对企业来说都是增加运营成本的 。


推荐阅读