作者:郑勰,腾讯 CSIG 网络产品部后台开发工程师
什么是 CAP
关于 CAP 理论的背景介绍已经很多,这里不过多介绍,我们谈谈如何理解它的问题。
用通俗易懂的话解释三个名词:
一致性
如果刚刚向一个节点写入,那么之后,从另外一个节点读取的必须是刚刚写入的数据,不能是更老的数据。
可用性
如果请求一个节点,这个节点必须能够给予回复,如果节点挂掉了,那就谈不上可用性了。
分区容忍性
是否容忍网络分区,即可以允许节点和其它节点无法通信。
CAP 的意思就是说我们最多只能保证其中两个条件同时成立。
下面我们来看看为什么。
如图所示,假如我们满足了分区容忍性,即虚线处表示两个节点发生了分区。
假如要满足一致性,那么,我们只能让请求另一个节点的操作暂时 hang 住,返回 client 失败或者超时的结果,这种情况多发生在银行柜台等对数据一致性要求很高的情境下,因为比起保证用户资金数目的正确性比暂时让用户无法操作要更重要一些。
假如要满足可用性,因为网络已经隔离,也就没办法达到一致性,这种情况多发生在互联网行业中,比如新闻等对数据一致性要求不高但对可用性要求高的情况下,毕竟,用户压根看不了新闻比看不到及时新闻要重要的多。
大家可以自己自由组合,最终会证明,三种条件不可能同时满足,其实大部分情况下,我们都是在一致性和可用性之间取舍而已。
Consistency = Consensus?
Consistency 几乎被业界用烂,以至于当我们在讨论一致性的时候,其实我们都无法确定对方所说的一致性是不是和自己的那个一致。
Consistency:一致性,Consensus:协同,这两个概念极容易混淆。
我们常说的一致性(Consistency)在分布式系统中指的是对于同一个数据的多个副本,其对外表现的数据一致性,如线性一致性、因果一致性、最终一致性等,都是用来描述副本问题中的一致性的。而共识(Consensus)则不同,简单来说,共识问题是要经过某种算法使多个节点达成相同状态的一个过程。在我看来,一致性强调结果,共识强调过程。