《架构师之路:架构设计中的100个知识点》6.CAP对工程架构的启示CAP对工程架构设计启示是什么?一句大白话总结:异步网络环境下,不要痴心妄想去设计一个系统,每个请求都返回最新的数据。这里所指的,异步网络(asynchronous network),是什么意思?意思就是:没法保证,在明确的,有限的时间内,完成消息投递。这里有一个重要的推论:发出一个消息很久没有收到回复,我们无法判断,是节点故障,还是消息要投递or处理很久。这里面的工程启示是:要对消息投递设置超时,以确保我们能在有限的时间内,得到一个响应,以便业务流程继续推进下去。画外音:超时发生时,我们仍然不知道是节点故障,还是消息要投递or处理很久。这个部分,主要是P的影响。上面所指的,每个请求都返回数据,是什么意思?这里指的是高可用。工程架构上,如何做到高可用?前提是,冗余。实现冗余的前提下,要么客户端重试,要么服务端故障自动转移。为了让调用方无感,有更好的体验,高可用的最佳实践是冗余+故障自动转移。NG想高可用,冗余NG。Web想高可用,冗余Web。Service想高可用,冗余Service。Cache想高可用,冗余Cache。DB想高可用,冗余DB。画外音:这里,是水平架构分层的维度。节点想容错,冗余节点。机架想容错,冗余机架。画外音:同一个集群内的多个节点,应该部署在不同的机架上,以防止机架掉电。机房想容错,冗余机房。15年前,我们在百度部署服务的时候,要考虑哪些节点部署在土城机房,哪些节点部署在酒仙机房,万一机房挂了怎么办。现在的工程师估计不考虑这些问题了。上面所指的,返回最新的数据,是什么意思?这里指的是一致性。CAP的证明抽象了这样一个系统,有一个值X,有两个操作:1. set(X)2. get()所谓的强一致性是指,某个set(X)成功后,后续所有get()都将在有限的时间内返回最新的值。对应的弱一致性,不是所有get()都能在有限的时间内返回最新的值。画外音:一致性模型,后续开一集单独讲。这里面的工程架构最佳设计实践是:大部分业务系统,在认可网络故障P的前提下,优先保证A而牺牲C,将C退化为“最终一致性”。这个工程实践,在许多分布式系统中都得到了广泛的应用。最后,简单做一个总结,CAP对工程架构设计的启示是什么?一句话:异步网络环境下,不存在一个系统,每个请求都返回最新的数据。展开说:P,架构设计要考虑网络异常,要设置超时;A,实现冗余与故障自动转移;C,大部分情况下,可以优先AP,并将强一致性退化为最终一致性,允许读旧数据;补充阅读材料《关于CAP的18个问题》git版本:https://github.com/henryr/cap-faq网页版:https://www.the-paper-trail.org/page/cap-faq/非常通俗,全面的介绍了大部分对CAP的疑问,文章不长,10分钟搞定。