80后聊架构:CAP对工程架构设计究竟有什么启示? | 架构师之路

科技   2024-11-08 17:55   北京  
《架构师之路:架构设计中的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分钟搞定。

==全文完==

我将以短视频+图文+直播+星球社群的形式,系统性的分享架构设计中的100个相关知识点,欢迎感兴趣的童鞋关注。
画外音:均免费。


本篇的前序短视频在这:

第6集:CAP为啥优先P?分区容忍到底容忍啥

平台对专业内容不推流,大家多帮忙标星,以及点赞,转发,在看三连。感谢!


下一期,和大家聊聊一致性模型与工程实践。

架构师之路
架构师之路,坚持撰写接地气的架构文章
 最新文章