简单解释下分布式系统中的CAP定理:
CAP定理: P-分区容错性, C-一致性, A-可用性 (易 ---> 难)
CAP如何选择 ==> 在不同的业务领域中对CAP的选择有所不同; (典型的情况以及选取的规则)
CAP的重要性 ==> CAP是分布式系统设计中最基础也最为关键的理论! (分布式系统不可能同时满足这三个条件, 最多满足两个条件!)
正确理解CAP的含义对于系统架构来讲是非常重要的! 对于分布式的系统, 它的网络传输不是特别的稳定, 经常会出现一些问题。从时间维度拉长去考虑, 必须要提前预判到网络出现问题, 并想出对策及解决方案。因此, 如何在出现网络故障时仍能维持系统按照原来的逻辑正常运转, 就显得十分重要了! ==> 结合CAP理论权衡!
C: Consistency, 一致性, 读操作是否总能总能读到前一个写操作的结果; (数据改变后要能感知到, 这是一致性想要表述的)
A: Availability, 可用性, 非故障节点应该在合理的时间内做出合理的响应; (不能给一个请求后很长时间不给客户端做出响应)
P: Partition tolerance, 分区容错性, 当出现网络分区现象后, 系统能够继续运行; (分区容错性可以理解为"网络错误", 当服务端有一个内容, 客户端得不到该内容, 因为二者之间由于通讯断掉而导致的, 网络之间通信不畅, 这就是分区容错性。从分布式的角度来讲, 网络是无法做到百分百可靠的!)
注: C、A、P三者之间只能任意选两者!
Client节点给G1节点发送了一个写消息, 改变了v1参数, 并且G1节点返回了修改完成的消息;
此时Client节点向G2节点读取参数, G2节点返回了v0参数, 很显然这两个结果值是不一致的(不是v1), 此时说明G1与G2节点没有达到一致性, 所以Client节点不知道哪个节点的参数才是正确的。
所以G1与G2节点之间是需要通信发消息进行同步的, Client节点告诉G1节点修改参数后, G1节点立刻将修改参数的信息同步给G2节点, 当Client节点向G2节点获取参数时, 拿到的参数信息就是正确的了。若能保证此类操作的效果, 就保证了一致性(Consistency)!
一致性: 不管从哪里读取数据, 得到的返回信息都是一致的!
例子:
1. 火车票: 要保证一致性 + 分区容错性(售票系统);
保证一致性原因: 不能出现两个人都能成功购买最后一张火车票的情况!
2. 银行转账: 要保证一致性 + 分区容错性; (一致性保证, 数据绝对可靠, 可以有延迟, 但绝不能出错!)
1. 什么情况下可用性高于一致性? (AP)
如: 看到页面最重要, 是不是最新的页面不重要。CDN中存页面缓存, 各个地区更新速率不一致, 但是要求一定要能看到页面, 一段时间后再对页面进行更新操作。
2. 什么情况下一致性高于可用性? (CP)
如: 支付、交易等场合, 对于一致性的要求都非常高! 可以允许暂时的不可用, 但绝对不能允许不一致!
结论: 结合业务场景, 合适的才是最好的!