作者:孤獨煙 
出處: http://rjzheng.cnblogs.com/

引言

本文翻譯自博客

http://ksat.me/a-plain-english-introduction-to-cap-theorem/

博主覺得這個故事講的生動活潑,因此翻譯來給大家分享,順便加上了點自己矯揉造作的見解,希望大家有所收穫!

CAP理論大概說一下就是,一致性(Consistency)、可用性(Availability)、分區容忍性(Partition tolerance)。

目前網上對這三大特性的解釋還是比較模糊,因此有了本文!

正文

"記憶公司"登場

昨天晚上你的妻子感謝你記得她的生日,並給她買了禮物。突然,一個點子閃過了你的腦海!人們現在普遍記憶力變差了,而你的記憶力卻十分的好。因此,爲何不成立一間公司可以充分運用自己的記憶天賦來賺錢呢?心動不如行動,你馬上登報分享你的點子

分佈式之大話CAP

以下是一次你和顧客的電話對話。

顧客:Hey,麻煩幫我記住我鄰居的生日。
你:當然可以。他生日什麼時候?
顧客:1月2日。
你:(在一個本子,翻到這位顧客的一頁,記錄下他鄰居的生日。)好的,已記錄好。下次你找回鄰居的生日,請再次撥打電話。
顧客:謝謝。
你:不客氣,本次收費0.1美元。

業務變大了

你的想法是如此簡單,除了紙質筆記本和手機之外什麼都不需要,但卻非常有效, 你每天都開始接聽數百個電話。

但慢慢的,問題出現了。顧客打電話進來時,需要等待的時間越來越多,另外,當你生病時,所有顧客都不能獲得服務,這令人很是煩惱。

於是,你開始了一個新的計劃:

  • 你和你的妻子同時接收顧客的電話
  • 顧客仍然只需要記着一個公司的服務電話 (555)–55-REMEM
  • 一個路由器會將顧客的電話分發到你和妻子電話上

第一次服務出問題

你的新計劃實行了兩天後,你接到了一個老客戶Jhon的電話。對話內容如下


John:Hey
你:很高興撥打記憶公司電話,有什麼可以幫到你嗎
John:可以告訴我去新澤西的航班是什麼時候嗎
你:當然,稍等1秒。(然後你翻開 John 的頁面,發現並沒有 John 航班的記錄)
你:你好,是不是搞錯了,我們這裏並沒有關於你航班的信息
John:什麼?!昨天我纔剛打電話過來說去新澤西航班的事情

這是怎麼回事勒? Jhon在撒謊麼?你稍加思考便找到了原因!應該是妻子接到了電話,你走到妻子的桌子,發現妻子將 John 的航班記錄在了本子上,這時你才意識到導致問題的原因,妻子接聽到 John 的電話,但你的本子沒有 John 的記錄。

這就存在一個嚴重的問題了!你的系統沒法保證一致性。打進來的電話可能其中一人接聽並記錄下來,下次電話查詢時卻可能由另一人接聽,這樣就會出現不一致的問題,無法爲顧客準確提供服務。

怎麼解決一致性問題

當你的妻子睡着後,晚上你躺在牀上輾轉難眠。在第二天清晨,你想到了一個全新的計劃,你叫醒了你的妻子並告訴她:

“親愛的,這是我們現在要做的!”

  • 我們兩個人中任何一個人接到電話(客戶要求我們記錄事情的時候),在掛電話之前,我們都要通知另一個人
  • 我們兩個同時在本子更新這位顧客的記錄
  • 下次這位顧客再次打電話進來查詢,這時我們不需要告知對方,因爲兩個本子都有這位顧客的記錄了

你對妻子說,這個方案只有一個問題,當有顧客需要記錄時,我們不能並行地工作。例如,你接收到記錄的電話並這個信息告知我,這時我就不能再接聽其他顧客的電話了。但這個問題基本上也是可以接受的,因爲大部分顧客的電話都是查詢的。

然而,這個方案雖然解決了一致性問題,但是依然存在可用性問題!如果某天我們其中一個人有事不能工作了怎麼辦?因爲,我們需要同時更新我們兩個人的本子,當我接到一個記錄的電話時,而你恰好不在,我就無法更新你的本子。這樣我們就無法完成客戶的請求,可用性無法保證!

更好的解決方案

難道就沒有同時滿足 一致性和可用性 的設計嗎?

你經過一夜的思考,又想到了一個方案,具體如下:

  • 當接到有記錄需求的電話,如果我們兩人當天都上班,那麼我們同時記錄下這位顧客的記錄
  • 如果有一個人沒上班,我們就將變更信息以email的形式發給另一個人
  • 第二天,沒上班的那個人上班後,先接收e-mail,並在自己的本子上記錄所有顧客的要求。記錄好後,纔開始接收第一個電話。

這樣我們就同時滿足了一致性和可用性的要求。

妻子生氣了

又過了一段時間,公司經營不錯。由於你藏私房錢的原因,妻子生氣了。

於是她接到一位顧客需要記錄的電話並沒告知你。由於記錄沒能在兩個本子更新,你的設計完全被打破了。你的設計建立在兩人良好溝通的前提下,如果出現溝通無法進行的情況,系統就出現問題了。也就是說,你的設計沒有達到 分區容忍性(partition tolerant)的要求。

ps:這就是滿足一致性和可用性的情況,無法保證分區容忍性。

當然,你也可以允許溝通無法進行的情況下繼續提供服務。你要是選擇可用性,你就無法保證你和你妻子之間本子上記錄的內容一致。

ps:這就是滿足分區容忍性和可用性的情況,無法保證一致性。

最後,你也可以允許溝通無法進行的情況下繼續提供服務。你要是選擇一致性,

那麼這個顧客的要求就無法完成,也就是可用性無法滿足。

ps:這就是滿足分區容忍性和一致性的情況,無法保證可用性。

總結

下面回顧CAP理論,對照三個定義如下。可以發現,我們最多滿足其中的兩個要求

一致性:一旦顧客更新了記錄,下次再打電話查詢時,總能獲取最新的記錄

可用性:只要你和妻子有人上班,記憶公司總能爲顧客提供服務

分區容忍性:即使你和妻子的溝通無法進行,記憶公司仍然可以提供服務

相关文章