面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

CAP理论指在一个分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个要素最多只能同时实现两点,不可能三者兼顾。 

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

让我们想象一个简单的分布式系统,它由G1和G2两个节点组成的,这两个节点都存有相同的变量V且初始值都是V0,如下图

面试官:CAP都搞不清楚,别跟我说你懂微服务!

客户端Client可以向任何一个节点发出读写请求,当节点收到该请求,经过计算返回相应的应答,如写数据操作

面试官:CAP都搞不清楚,别跟我说你懂微服务!

读数据操作如下

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

分区容错性P

The system will continue to function when network partitions occur.

当网络出现分区后,系统能够继续履行职责。

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

一致性C

A read is guaranteed to return the most recent write for a given client. 

对某个指定的客户端来说,它的读操作保证能够返回最新的写操作结果。如下

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

节点G1在应答client之前,先把数据同步给G2节点,当client从G2读取时就已经是最新的数据了,从而达到了数据的一致性。

可用性A

A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).

非故障节点将在合理的时间内返回合理的响应,但不能是错误响应或超时。

面试官:CAP都搞不清楚,别跟我说你懂微服务!

面试官:CAP都搞不清楚,别跟我说你懂微服务!

第一阶段,client向节点G1发出写操作请求,数据是v1。由于网络分区,导致G1无法把数据同步给G2节点,如果此时满足可用性A,client向节点G2发出读操作请求,如下图

面试官:CAP都搞不清楚,别跟我说你懂微服务!

由于满足可用性A则G2返回给client的数据是v0,则不满足一致性C。如果需要满足一致性C,则失联的G2暂时不可用,直到网络恢复并同步数据完成方可。

面试官:CAP都搞不清楚,别跟我说你懂微服务!

本文部分内容参考并翻译于

https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/

面试官:CAP都搞不清楚,别跟我说你懂微服务!

End

版权归@码农神说所有,转载须经授权,翻版必究

推荐阅读

1、你不知道的前端异常处理(万字长文,建议收藏)

2、你不知道的 TypeScript 泛型(万字长文,建议收藏)

3、你不知道的 Web Workers (万字长文,建议收藏)

4、写给初中级前端的高级进阶指南(万字长文,建议收藏)

5、或许是一本可以彻底改变你刷 LeetCode 效率的题解书

6、想去力扣当前端,TypeScript 需要掌握到什么程度?

7、如果张东升是个程序员

关注加加,星标加加~

面试官:CAP都搞不清楚,别跟我说你懂微服务!

如果觉得文章不错,帮忙点个在看呗