【原创】分布式之大话CAP
引言
本文翻譯自博客
http://ksat.me/a-plain-english-introduction-to-cap-theorem/
博主覺得這個(gè)故事講的生動(dòng)活潑,因此翻譯來給大家分享,順便加上了點(diǎn)自己矯揉造作的見解,希望大家有所收獲!
CAP理論大概說一下就是,一致性(Consistency)、可用性(Availability)、分區(qū)容忍性(Partition tolerance)。
目前網(wǎng)上對(duì)這三大特性的解釋還是比較模糊,因此有了本文!
正文
"記憶公司"登場
昨天晚上你的妻子感謝你記得她的生日,并給她買了禮物。突然,一個(gè)點(diǎn)子閃過了你的腦海!人們現(xiàn)在普遍記憶力變差了,而你的記憶力卻十分的好。因此,為何不成立一間公司可以充分運(yùn)用自己的記憶天賦來賺錢呢?心動(dòng)不如行動(dòng),你馬上登報(bào)分享你的點(diǎn)子
以下是一次你和顧客的電話對(duì)話。
顧客:Hey,麻煩幫我記住我鄰居的生日。
你:當(dāng)然可以。他生日什么時(shí)候?
顧客:1月2日。
你:(在一個(gè)本子,翻到這位顧客的一頁,記錄下他鄰居的生日。)好的,已記錄好。下次你找回鄰居的生日,請?jiān)俅螕艽螂娫挕?br /> 顧客:謝謝。
你:不客氣,本次收費(fèi)0.1美元。
業(yè)務(wù)變大了
你的想法是如此簡單,除了紙質(zhì)筆記本和手機(jī)之外什么都不需要,但卻非常有效, 你每天都開始接聽數(shù)百個(gè)電話。
但慢慢的,問題出現(xiàn)了。顧客打電話進(jìn)來時(shí),需要等待的時(shí)間越來越多,另外,當(dāng)你生病時(shí),所有顧客都不能獲得服務(wù),這令人很是煩惱。
于是,你開始了一個(gè)新的計(jì)劃:
- 你和你的妻子同時(shí)接收顧客的電話
- 顧客仍然只需要記著一個(gè)公司的服務(wù)電話 (555)–55-REMEM
- 一個(gè)路由器會(huì)將顧客的電話分發(fā)到你和妻子電話上
第一次服務(wù)出問題
你的新計(jì)劃實(shí)行了兩天后,你接到了一個(gè)老客戶Jhon的電話。對(duì)話內(nèi)容如下
John:Hey
你:很高興撥打記憶公司電話,有什么可以幫到你嗎
John:可以告訴我去新澤西的航班是什么時(shí)候嗎
你:當(dāng)然,稍等1秒。(然后你翻開 John 的頁面,發(fā)現(xiàn)并沒有 John 航班的記錄)
你:你好,是不是搞錯(cuò)了,我們這里并沒有關(guān)于你航班的信息
John:什么?!昨天我才剛打電話過來說去新澤西航班的事情
這是怎么回事勒? Jhon在撒謊么?你稍加思考便找到了原因!應(yīng)該是妻子接到了電話,你走到妻子的桌子,發(fā)現(xiàn)妻子將 John 的航班記錄在了本子上,這時(shí)你才意識(shí)到導(dǎo)致問題的原因,妻子接聽到 John 的電話,但你的本子沒有 John 的記錄。
這就存在一個(gè)嚴(yán)重的問題了!你的系統(tǒng)沒法保證一致性。打進(jìn)來的電話可能其中一人接聽并記錄下來,下次電話查詢時(shí)卻可能由另一人接聽,這樣就會(huì)出現(xiàn)不一致的問題,無法為顧客準(zhǔn)確提供服務(wù)。
怎么解決一致性問題
當(dāng)你的妻子睡著后,晚上你躺在床上輾轉(zhuǎn)難眠。在第二天清晨,你想到了一個(gè)全新的計(jì)劃,你叫醒了你的妻子并告訴她:
“親愛的,這是我們現(xiàn)在要做的!”
- 我們兩個(gè)人中任何一個(gè)人接到電話(客戶要求我們記錄事情的時(shí)候),在掛電話之前,我們都要通知另一個(gè)人
- 我們兩個(gè)同時(shí)在本子更新這位顧客的記錄
- 下次這位顧客再次打電話進(jìn)來查詢,這時(shí)我們不需要告知對(duì)方,因?yàn)閮蓚€(gè)本子都有這位顧客的記錄了
你對(duì)妻子說,這個(gè)方案只有一個(gè)問題,當(dāng)有顧客需要記錄時(shí),我們不能并行地工作。例如,你接收到記錄的電話并這個(gè)信息告知我,這時(shí)我就不能再接聽其他顧客的電話了。但這個(gè)問題基本上也是可以接受的,因?yàn)榇蟛糠诸櫩偷碾娫挾际遣樵兊摹?/p>
然而,這個(gè)方案雖然解決了一致性問題,但是依然存在可用性問題!如果某天我們其中一個(gè)人有事不能工作了怎么辦?因?yàn)?#xff0c;我們需要同時(shí)更新我們兩個(gè)人的本子,當(dāng)我接到一個(gè)記錄的電話時(shí),而你恰好不在,我就無法更新你的本子。這樣我們就無法完成客戶的請求,可用性無法保證!
更好的解決方案
難道就沒有同時(shí)滿足 一致性和可用性 的設(shè)計(jì)嗎?
你經(jīng)過一夜的思考,又想到了一個(gè)方案,具體如下:
- 當(dāng)接到有記錄需求的電話,如果我們兩人當(dāng)天都上班,那么我們同時(shí)記錄下這位顧客的記錄
- 如果有一個(gè)人沒上班,我們就將變更信息以email的形式發(fā)給另一個(gè)人
- 第二天,沒上班的那個(gè)人上班后,先接收e-mail,并在自己的本子上記錄所有顧客的要求。記錄好后,才開始接收第一個(gè)電話。
這樣我們就同時(shí)滿足了一致性和可用性的要求。
妻子生氣了
又過了一段時(shí)間,公司經(jīng)營不錯(cuò)。由于你藏私房錢的原因,妻子生氣了。
于是她接到一位顧客需要記錄的電話并沒告知你。由于記錄沒能在兩個(gè)本子更新,你的設(shè)計(jì)完全被打破了。你的設(shè)計(jì)建立在兩人良好溝通的前提下,如果出現(xiàn)溝通無法進(jìn)行的情況,系統(tǒng)就出現(xiàn)問題了。也就是說,你的設(shè)計(jì)沒有達(dá)到 分區(qū)容忍性(partition tolerant)的要求。
ps:這就是滿足一致性和可用性的情況,無法保證分區(qū)容忍性。
當(dāng)然,你也可以允許溝通無法進(jìn)行的情況下繼續(xù)提供服務(wù)。你要是選擇可用性,你就無法保證你和你妻子之間本子上記錄的內(nèi)容一致。
ps:這就是滿足分區(qū)容忍性和可用性的情況,無法保證一致性。
最后,你也可以允許溝通無法進(jìn)行的情況下繼續(xù)提供服務(wù)。你要是選擇一致性,
那么這個(gè)顧客的要求就無法完成,也就是可用性無法滿足。
ps:這就是滿足分區(qū)容忍性和一致性的情況,無法保證可用性。
總結(jié)
下面回顧C(jī)AP理論,對(duì)照三個(gè)定義如下。可以發(fā)現(xiàn),我們最多滿足其中的兩個(gè)要求
一致性:一旦顧客更新了記錄,下次再打電話查詢時(shí),總能獲取最新的記錄
可用性:只要你和妻子有人上班,記憶公司總能為顧客提供服務(wù)
分區(qū)容忍性:即使你和妻子的溝通無法進(jìn)行,記憶公司仍然可以提供服務(wù)
轉(zhuǎn)載于:https://www.cnblogs.com/rjzheng/p/10043054.html
總結(jié)
以上是生活随笔為你收集整理的【原创】分布式之大话CAP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比MySQL快6倍 深度解析国内首个云原
- 下一篇: 7号团队-团队任务3:每日例会(2018