2022
Mar
05
CAP 定理是指一个分散式系统 storage ,三个功能 Consistency / Availability / Partition Tolerance 只能满足其中的两项,不可能同时满足全部。
这个定理只存在分散式系统,也就是你的机器数必须大於 1 ,且组成一个机器群,这一群机器之间会互相通讯,并同步资料。

下面文章将使用 Node 代称机器。

C: Consistency , 所有的 Nodes 资料必须一致
A: Availability ,Always Success 所有的 Request 都能得到成功且正确的 Response ,不能 Timeout 或是 Error
P: Partition Tolerance,容错,当 Nodes 之间的网路发生问题,所有 Nodes 仍然可以运作。

这个定理告诉我们只能满足 CP or AP or CA 三取二,无法同时满足网路有问题的情况下保证资料一致且得到成功的 Response, 而 CA 没有 P 代表非分散式系统,不是 CAP 讨论的范围, CA 只有一个 Node ,讨论 CA 也没什么意义。


满足 CP 的情况


CP 是指网路有问题的情况下,维持资料一致性,但不保证成功得到 Response ,也就是 User 可能会拿到一个 Error,从图中可以看出来 Node A 的资料已从 10 更新为 20 ,但因为网路断掉无法将这个 update 传送给 Node B,Node B 在不知道资料已更新的情况下,这时可以回传 10 或 Error,如果回传 10 就代表资料不一致,不满足 Consistency 这个条件,最终 Node B 只能回传 Error。

满足 AP 的情况

AP 是指网路有问题的情况下,可以成功得到 Response ,但不保证资料是最新的,也就是 User 可能会拿到一个过期的资料,从图中可以看出来 Node A 的资料已从 10 更新为 20 ,但因为网路断掉无法将这个 update 传送给 Node B,Node B 在不知道资料已更新的情况下,还是回传旧的数值 10。


什么时候要选用 CP 呢

如果你要开发一个购物系统,有商品资料库及它的库存量,若是库存量的 Storage 选用 AP 会发生什么事呢? 假设我的商品库存量是 5 ,有 3 个人同时购买了这个商品,又刚好购买的当下 Node 间的网路出现状况。

- 第一个人成功购买,Node A 库存量 5 - 1 剩余 4
- 第二个人也成功购买,但因为网路问题 Node B 的库存量还是 5, 5 - 1 剩余 4
- 第三个人也成功购买,Node A 的库存量 4 - 1 剩余 3
这个情况下 Node A 库存量是 3 , Node B 库存量是 4 ,数据是不一致, 而且总共卖出了 3 件(超卖一件),为了避免发生超卖的问题,购物系统 Storage 最好要选择 CP 。

各种 Storage CAP

- CA: Memcached
- CP: Redis / MongoDB
- AP: Dynamodb / Cassandra / Vespa-engine
- MySQL: master CA , slave AP

回應 (Leave a comment)