技術(shù)大牛談CAP認(rèn)識(shí)偏差與選擇假象
關(guān)于CAP原理的討論很多,而且通常會(huì)在分布式系統(tǒng)中產(chǎn)生誤解。它規(guī)定:任何連網(wǎng)和分享數(shù)據(jù)的系統(tǒng)最多可以保證以下三個(gè)屬性的兩個(gè):一致性、可用性和分區(qū)容錯(cuò)性。我在此不會(huì)詳細(xì)介紹CAP,因?yàn)樗婕暗姆矫婧芏?,但?ldquo;三個(gè)中的兩個(gè)”肯定是有誤導(dǎo)性的——雖然概念上很容易理解。Brewer曾經(jīng)指出這個(gè)問(wèn)題,而且認(rèn)同的聲音很多,但是人們對(duì)于這個(gè)話題仍然存在很多的爭(zhēng)議。底線是你不能犧牲分區(qū)容錯(cuò)性,但是似乎CAP在這個(gè)方面有一些偏差。
表面上,CAP將系統(tǒng)分成了三類。CA表示一個(gè)在保持一致性和可用性前提下實(shí)現(xiàn)完美可選性的網(wǎng)絡(luò)系統(tǒng)。CP在犧牲一定可用性的前提下實(shí)現(xiàn)一致性和分區(qū)容錯(cuò)性,而AP則不考慮線性一致性的前提下實(shí)現(xiàn)可用性和分區(qū)容錯(cuò)性。顯然,CA暗示系統(tǒng)只有在不存在網(wǎng)絡(luò)分區(qū)時(shí)才保證一致性和可用性。然而,要說(shuō)完全不存在網(wǎng)絡(luò)分區(qū),這顯然是不太現(xiàn)實(shí)的。這正是許多爭(zhēng)議發(fā)生的根源。
分區(qū)一定有。它們的出現(xiàn)有很多的原因。交換故障、NIC故障、鏈路層故障、服務(wù)器故障、進(jìn)程故障等,都可能導(dǎo)致分區(qū)出現(xiàn)。即使系統(tǒng)不發(fā)生故障,也有其他原因可能引起分區(qū),例如GC暫?;蜷L(zhǎng)時(shí)間延遲。我們要先接受這個(gè)事實(shí),然后再繼續(xù)分析。這意味著,只有當(dāng)一個(gè)“CA”系統(tǒng)變?yōu)椴籆A時(shí),它才是CA的。一旦出現(xiàn)分區(qū),所有假設(shè)和所有保證都會(huì)以某一種方式產(chǎn)生嚴(yán)重后果。什么位置不會(huì)出現(xiàn)這個(gè)問(wèn)題呢?
CAP的核心在于平衡折衷,但是它是一個(gè)排他原則。它告訴我們系統(tǒng)在特定的現(xiàn)實(shí)條件下不能做什么?這其中的區(qū)別是并非所有系統(tǒng)都能很好地符合這些模型。如果說(shuō)Jepsen曾經(jīng)教會(huì)我們什么,那么一定是讓我們知道大多數(shù)系統(tǒng)都不符合這些分類,即使當(dāng)初設(shè)計(jì)者說(shuō)是符合的。在實(shí)踐中,CAP并不是只有黑白兩面。
Nicolas Liochon最近寫了一系列非常不錯(cuò)的CAP文章。他很好地解釋了這個(gè)既晦澀又容易誤解的術(shù)語(yǔ)(比我解釋得好多了),并且提出了一些非常有意義的觀點(diǎn)。Nicolas認(rèn)為,CA實(shí)際上應(yīng)該看作為一種運(yùn)營(yíng)范疇的規(guī)范,而CP和AP則是關(guān)于行為的描述。我認(rèn)同這一點(diǎn),但是我的問(wèn)題是它回避了一定會(huì)出現(xiàn)的平衡折衷。
我們知道網(wǎng)絡(luò)分區(qū)是無(wú)法避免的。如果我們給應(yīng)用程序這樣的規(guī)定:“這個(gè)應(yīng)用程序不會(huì)處理網(wǎng)絡(luò)分區(qū)。如果出現(xiàn)網(wǎng)絡(luò)分區(qū),那么應(yīng)用程序?qū)⒉糠质?,?shù)據(jù)可能受到破壞,而且你可能不得不手工修復(fù)數(shù)據(jù)。”換而言之,我們?cè)谶@里實(shí)際上要求的是CA,但是如果有一個(gè)分區(qū)出現(xiàn),那么就可能屬于CP;或者說(shuō),很不幸地同時(shí)失去了可用性和一致性。
在運(yùn)營(yíng)范疇內(nèi),CA實(shí)際上意味著當(dāng)出現(xiàn)一個(gè)分區(qū)時(shí),系統(tǒng)會(huì)攤開(kāi)雙手并發(fā)出信息:“我拋錨了!”如果我們指定系統(tǒng)不能在網(wǎng)絡(luò)分區(qū)下正常工作,也就是說(shuō)分區(qū)不在運(yùn)營(yíng)范疇之內(nèi)。我們?cè)诘厍蛏辖o一個(gè)設(shè)計(jì)飛往他拉星球大氣層的太空飛船指定一個(gè)規(guī)范有什么意義呢?我們處于一個(gè)分區(qū)普遍存在的世界中,因此我們肯定要在運(yùn)營(yíng)范疇中支持分區(qū)。CA確定規(guī)定了一個(gè)運(yùn)營(yíng)范疇,但是你不能將它寫到SLA然后交給客戶看。通俗地說(shuō),在沒(méi)有定義的時(shí)候,它只是一種“未定義行為”模式 ——系統(tǒng)是一致和可用的。CAP并不是一個(gè)完美的概念,但是在我看來(lái),它確實(shí)很好地強(qiáng)調(diào)了構(gòu)建分布式系統(tǒng)過(guò)程中需要考慮的一些基本折衷問(wèn)題。無(wú)論我們有沒(méi)有在書面寫下來(lái),它們都存在。如果寫下來(lái)了,我們也無(wú)法保證可用性。在面對(duì)分區(qū)時(shí),CAP似乎只能在一致性和可用性上面二選一。事實(shí)上,這里并不是只有兩個(gè)選擇。你可以選擇AP、CP或兩者都不選。兩者都不選的問(wèn)題是,我們很難推出它的原因,甚至很難給它定義。最終,它只是一種選擇假象,因?yàn)槲覀儾豢赡軤奚謪^(qū)容錯(cuò)性。