← 全部概念地圖
標準

概念地圖・CAP 定理

分類:系統

這一頁不只是把一個概念解釋一遍——一張自己畫的結構圖,加上拿台灣情境從頭走一次的實例演練、這個框架什麼時候會騙你,以及它接回 P.A.I.N. 之後長什麼樣。一頁必須交付的三層 →

CAP 定理:斷線的那一刻,只能守兩個角

機隊調度平板在隧道裡連不上訊號,已經四十分鐘。工地那頭還是得知道:哪一台鑽掘機現在派得出去。CAP 定理畫的就是這一刻——一份資料放在好幾台機器上,機器之間的線一斷,你只保得住「大家讀到的是同一份」與「隨時答得出來」其中一個。三個角看起來像三選二,實際上分區那一角由不得你選,它遲早會發生。真正被逼到檯面上的,是斷線那一秒要交出哪一種答案——而這件事,通常在寫下第一行程式碼之前就已經決定了。

CAP 三角:三個角最多同時守住兩個 一個正三角形。上方頂點是一致性,左下是可用性,右下是分區容忍。三條邊各代表守住相鄰兩個角的組合:右邊那條連一致性與分區容忍,標 CP,註明斷線就先停下來;底邊連可用性與分區容忍,標 AP,註明照樣答、答的可能是舊的;左邊那條連一致性與可用性,標 CA,畫成朱紅虛線,旁邊註明那是只有單機才有的選項。三角形中央寫著:網路一斷,題目只剩兩個答案。 CAP 三角:三個角,最多同時守住兩個 一致性(C) 大家讀到的是同一份 可用性(A) 隨時答得出來 分區容忍(P) 斷線也還能運作 網路一斷,題目只剩兩個答案 AP 照樣答,答的可能是舊的 CA 只有單機才有的選項 CP 斷線就先停下來 註:分區這一角由不得你選,機器之間遲早會斷;真正在選的是斷線當下要守一致還是守可用。
三條邊各是一種取捨,其中一條只有單機才走得到。

三個角各承諾什麼,斷線時剩下什麼

先把三個角當成三張對客戶開出的支票,一張一張看它承諾了什麼、斷線那一刻兌不兌得出來。

角它承諾什麼網路一斷時的實際行為放掉它的代價
一致性(C)不管問哪一台機器,讀到的都是最新那一份連不上的那一側先停手,寧可不答有人照著一份過期的資料下了決定
可用性(A)每一台都答得出來,不會把請求擋在門外照樣回答,答的可能是四十分鐘前那份斷線期間整套系統對外等於關門
分區容忍(P)機器之間的線斷掉,整套照樣運作這一角由不得你選,它遲早會發生只剩單機一條路,那台一掛就全掛

表格最右邊那一欄,才是這張圖真正的內容。三條邊裡有一條是虛線:CA 要求你同時守住一致與可用,代價是完全不容忍分區——換句話說,資料只准放在一台機器上。只要你已經有第二台、有備援、有異地機房,那條虛線就從選項裡消失了,題目當場從三選二變成二選一。

這套系統該守哪一角,斷線之前先想三件事

把上面那張圖套到一支機隊調度系統上,真正該問的其實是三個很土的問題——「要不要一致」這種大哉問,一次都用不上。

一、回一個舊值出去,後果長什麼樣。調度平板在隧道裡讀到四十分鐘前的派工狀態,這件事本身不痛;痛的是有人照著它把一台鑽掘機開走了。同一份舊資料,落在「查一下今天有幾台在線」上是零成本,落在「這台現在派得出去嗎」上就是兩組人跑同一台。判準落在那份舊資料被誰拿去做了哪一種動作——舊了幾分鐘,反而是次要的。自問:四十分鐘前那份狀態被人照著執行一次,最壞會發生什麼事?

二、兩邊各自改過的資料,事後合得起來嗎。斷線期間,A 工地把 7 號機標成已派出,B 工地也把 7 號機標成已派出——線一接回來,系統要不要自己決定誰贏?有些資料天生好合:計數器可以相加,最後編輯時間可以取大。有些資料合不了:一台機器的實體位置只有一個。合得起來的,選可用那一邊幾乎沒有損失;合不起來的,你等於把仲裁工作外包給運氣。自問:這筆資料如果兩邊同時被改,我有沒有一條不必找人問就能執行的合併規則?

三、斷線多久算久,你這個場景的忍受上限是幾分鐘。隧道盲區平均一次四十分鐘,這個數字要跟另一個數字擺在一起看:工地停等到第幾分鐘會開始打電話罵人。兩個數字誰大誰小,直接決定你該站在哪一條邊上。上限是五分鐘的場景,選一致那一邊等於保證每次盲區都出事;上限是一整個班次的場景,停下來等反而是最省事的做法。自問:從斷線到有人開始抱怨,中間有幾分鐘?這個數字我量過還是猜的?

一套鑽掘機隊調度的隧道盲區,兩種選法各走一次

底下這家台灣中部的隧道工程公司,是為了把這個結構講清楚而編出來的示意情境,沒有指涉任何真實公司。它手上那套機隊調度系統,剛好站在三角形的正中間。

實例演練
  • 盤點現場:12 台鑽掘機、3 個工地,調度中心一套主機,每個工地一台平板。派工紀錄要三邊都看得到,所以資料本來就放在四個地方。結構清楚
  • 量斷線的長度:隧道盲區平均一次 40 分鐘,一天約 2 次,一個月約 60 次。這 60 次是可以預先排進行事曆的日常。數字量得到
  • 選可用那一邊(AP):平板照樣顯示 40 分鐘前的派工狀態,工地照樣派得出去。代價是兩個工地重複派同一台,一個月發生約 2 次——每次要有人開車去現場把機器要回來。重複派工
  • 選一致那一邊(CP):斷線就不讓派工,畫面直接鎖住。代價是工地停等,一次平均 25 分鐘,一個月合計 60 × 25 = 1500 分鐘,也就是 25 小時。整月停等 25 小時
  • 看帳記在誰頭上:重複派工那 2 次,記在調度員的帳上——他要打電話、要道歉、要重排。25 小時停等,記在工地的工時上,而工地主任的績效表上沒有一欄叫「系統守住了一致性」。兩本帳

把兩種選法的代價擺在一起,會看到一件比技術更麻煩的事:它們根本不是同一種單位。一邊是一個月 2 次的尷尬電話,一邊是一個月 25 小時的怠工,兩者沒辦法直接相減。真正決定該選哪一邊的,往往是誰坐在會議室裡——調度中心提案時,25 小時停等只是簡報上的一行字;工地主任提案時,那 2 次重複派工聽起來像是可以忍的小事。技術上這是一道取捨題,實務上它更像一道「誰的痛比較容易被聽見」的政治題。所以這張三角圖該被搬到會議桌上——留在工程師的白板上,它只解得了一半;擺到桌子中間,它才逼得所有人在同一張圖上指出自己站哪裡。以上為說明結構用的示意情境,僅供理解框架之用。

這個三角什麼時候會騙你

  1. 「三選二」這個講法,把一個連續的旋鈕講成了三個開關。真實系統很少整套只走一邊。同一套機隊調度可以讓「查看機器位置」走可用那一邊、讓「確認派工」走一致那一邊——同一份資料的不同動作,站在不同的邊上。把 CAP 當成一次性的架構決定,你會在一份規格書裡吵三個月;把它當成逐個功能問一次的檢查表,一個下午就問得完。
  2. 沒有斷線的那 99% 時間,這張圖一句話都沒說。CAP 只描述分區發生當下的行為,可是系統絕大多數時候線是通的。線通的時候仍然有取捨:要不要等三台機器都回報才算數,直接決定使用者按下按鈕後要等 20 毫秒還是 200 毫秒。後來 PACELC 補的就是這一段——沒有分區的時候,你在延遲與一致之間還得再選一次。只看 CAP 的人,會把一個天天發生的取捨,誤當成一年才遇到幾次的意外。
  3. 它管得到資料,管不到人。系統守住一致、斷線就鎖住畫面,工地那頭不會安靜坐著等——他們會打電話、會用 LINE 群組、會拿紙本記下來,等訊號回來再補登。於是你以為自己買到了一致性,實際上買到的是一套跑在系統外面的影子流程,而那套流程沒有稽核紀錄。這張圖畫的是機器之間的分區,畫不到人與系統之間那條更常斷的線。

被放下的那個角,代價記在誰頭上

痛點視角

分區發生的那一秒,選擇早就做完了。

只是做選擇的那個人,往往離後果很遠。這張圖畫得出哪兩個角守得住,畫不出被放下那一角的痛落在誰身上——而《痛點》整本書問的正是後面那一半:誰在痛、痛到什麼程度、他願不願意為了不痛而付錢。機隊調度那一題,AP 與 CP 在架構圖上是對稱的兩條邊,在人身上完全不對稱:一邊是調度員一個月多打兩通電話,一邊是三個工地一個月被鎖住 25 小時。同樣一張三角,換一個人來標,指的位置就變了。這也是為什麼「技術選型」這四個字常常吵不出結果——大家其實在爭誰的痛比較不值錢。今晚就能做的一件事:把你手上那套系統斷線時的實際行為寫下來,拿去問一次那個要吞下後果的人,問他四十分鐘的舊資料他認不認。他的回答,比任何一份架構評估報告都準。

關於 CAP 定理,常見問題

CAP 定理是不是說我只能從三個裡面挑兩個?

字面上是,實務上更像二選一。分區容忍那一角由不得你選:只要資料放在兩台以上的機器,機器之間的線就有斷掉的一天,而你不能假裝它不會斷。所以那條要求「同時守住一致與可用」的邊,在圖上被畫成虛線——它只存在於單機系統。真正落到你手上的題目是:斷線發生的時候,這個功能要繼續回答,還是先停下來。

選了可用那一邊,是不是等於資料會亂掉?

答案不會憑空變錯,只是會晚一點才追上。選可用那一邊的系統通常搭配「最終一致」:斷線期間各自接受寫入,線接回來之後再合併。關鍵在你的資料合不合得起來。購物車的商品可以合併、按讚數可以相加,這種資料選可用幾乎沒有損失。座位、庫存最後一件、一台實體機器的位置這類「只有一個」的資料,合併就會有人吃虧,那才是該站到一致那一邊的功能。

我的系統只有一台資料庫,還需要管 CAP 嗎?

單機的時候,你站在那條虛線上,一致與可用都拿得到,代價是那台機器停機的時候整套跟著停。所以問題會換一個形式回來:你什麼時候會加第二台?加備援、加讀取副本、上雲之後開了多可用區,那一刻虛線就斷了,這張三角才開始生效。多數團隊是在加完第二台的半年後,才被一次詭異的資料不一致提醒這件事。

PACELC 又是什麼,跟 CAP 差在哪?

PACELC 是 CAP 的續集:分區發生時(P)在可用與一致之間選(A/C),否則(E)在延遲與一致之間選(L/C)。它補上的正是 CAP 沒畫的那 99% 時間——線通的時候,你要不要為了確保每一台都同步而多等那 100 毫秒。實務上這一段的影響往往比分區更大,因為它天天在發生,而分區一個月才幾次。看完三角圖,下一步就是把 E 那一半也問一次。

畫一個三角形,把你手上那套系統斷線時的實際行為標上去。標完之後,可以順手翻一下三元悖論:那張圖的三選二在講匯率、利率與資本流動,這張的三選二在講資料一致、隨時可用與斷線容忍,兩張圖問的是同一種問題——你想全拿的那三樣,哪一樣得先放手。至於決定守一致之後該怎麼落地,法定人數交集接著回答的是「要幾票才算數」,而這張三角先幫你決定斷線的時候要保住哪一邊。

發現引用或事實有誤?請寫信回報,我會依更正政策修正。