在設(shè)計(jì)分布式系統(tǒng)時(shí),常常會(huì)用到“CAP理論”來(lái)權(quán)衡和考量某些“上限”情形。下面要講的這個(gè)故事,能幫助小伙伴們更容易理解“CAP理論”——咳咳,排排坐,吃果果,開始講故事啦!~\(≧▽≦)/~
第一集
商機(jī)無(wú)處不在——A君的“記憶公司”初誕生!
從前有個(gè)A君,他好像天生記憶力就特別好。俗話說(shuō),健忘是男人的通病,但A君不一樣,大到結(jié)婚紀(jì)念日、老婆大人生日,小到“兩人第一次約會(huì)紀(jì)念日”,“家里的寵物汪生日”,他都能如數(shù)家珍。這不,昨晚正是老婆大人生日,他即時(shí)送驚喜,哄得老婆大人忒開心。“我的記憶力咋就這么贊呢?”他一陣陶醉……突然,一道靈光閃過(guò),“何不開個(gè)公司好好利用這天賦來(lái)賺錢?!”而且新公司的廣告就這么打:
A君說(shuō)做就做,他的“記憶公司”就這樣開張了,員工規(guī)模嘛,一個(gè)人——他自己。
“記憶公司”的日常業(yè)務(wù)通話是這樣的:
第二集
是時(shí)候擴(kuò)大規(guī)模了!
由于A君貼心的服務(wù)質(zhì)量,當(dāng)然還有他磁性低沉的迷人嗓音,顧客來(lái)電絡(luò)繹不絕。不久后,“記憶公司”就得到某著名創(chuàng)業(yè)孵化器的大筆贊助了。你想啊,A君只需要一個(gè)筆記本和一個(gè)電話就能開展業(yè)務(wù),業(yè)務(wù)規(guī)模當(dāng)然擴(kuò)張得很迅速。不知不覺(jué)A君每天的電話業(yè)務(wù)量快破千,這下忙得他焦頭爛額。
還有更嚴(yán)重的問(wèn)題來(lái)了。越來(lái)越多顧客打電話過(guò)來(lái)發(fā)現(xiàn)永遠(yuǎn)占線,很多人等得不耐煩就掛斷了。再加上A君最近實(shí)在太累,終于有天病倒了沒(méi)有開工,那一整天的業(yè)務(wù)就這么泡湯了,而對(duì)于那天急需信息的顧客來(lái)說(shuō),不滿的情緒更是直線飆升。
是時(shí)候擴(kuò)大公司規(guī)模了!A君立刻動(dòng)員親愛的老婆大人來(lái)幫忙。
而且他設(shè)計(jì)了一個(gè)簡(jiǎn)單的新系統(tǒng):
?我和老婆一人一部分機(jī)。
?顧客依然撥打(888)–88-REMEM,他們只需記住這一個(gè)號(hào)碼。
?通過(guò)一部PBX(電話交換機(jī))將每個(gè)顧客來(lái)電平等發(fā)送到我和老婆兩人中正空閑的一部分機(jī)上。
第三集
遭遇第一次服務(wù)危機(jī)
就在新系統(tǒng)上線兩天后,A君接到忠實(shí)顧客老王的電話:
這是怎么一回事?老王在撒謊嗎?A君沉思了一秒鐘,恍然大悟!——昨天老王的電話是老婆接的——A君馬上來(lái)到老婆的書桌前翻看她的筆記本。果不其然,老王的航班信息就在上面!A君把這次坑爹遭遇說(shuō)給了老婆聽,她表示也注意到了這個(gè)問(wèn)題……
A君一想到這些就抓狂。
第四集
一致性問(wèn)題成功修復(fù)!
自從發(fā)現(xiàn)了“一致性”問(wèn)題后,A君整夜輾轉(zhuǎn)反側(cè),苦思冥想解決辦法。終于在一天清晨,一個(gè)絕妙的方案讓他想到了!他興奮地?fù)u醒一旁熟睡的老婆大人,急不可耐地告訴她:
“親愛的,我想到解決辦法了!接下來(lái)我們可以這么辦:”
?從現(xiàn)在開始,我們兩人無(wú)論誰(shuí)接到顧客的電話(有信息要求我們記錄),我們必須通知對(duì)方本次更新信息。
?我們要在各自的筆記本上同時(shí)記錄這次更新信息,才算這個(gè)電話close file。
?當(dāng)顧客致電來(lái)索要之前存放的信息時(shí),我們無(wú)需詢問(wèn)對(duì)方,只要查看各自的筆記本就行了。因?yàn)槲覀z的筆記本所記載的顧客信息同一時(shí)段時(shí)刻保持著同步更新。
“好像還有一個(gè)問(wèn)題!”A君突然意識(shí)到。
“這樣一來(lái),每次有新的顧客信息“更新”,我們兩人都得同時(shí)做記錄,我們就不能在并行的時(shí)間段里接電話了!”
“而且,我們無(wú)論何時(shí)不能給顧客提供錯(cuò)誤信息。”A君補(bǔ)充到。
“完全同意”,A君的老婆連連點(diǎn)頭,“但是這系統(tǒng)還有另一個(gè)缺陷你沒(méi)注意到。如果哪天我們當(dāng)中有一個(gè)沒(méi)開工,那就意味著那天所有的‘更新電話’(即:顧客有更新信息要求記錄)我們就沒(méi)能接到,因?yàn)闆](méi)開工的那一方?jīng)]有更新任何記錄。也就是說(shuō),系統(tǒng)還存在“可用性”的問(wèn)題。"
第五集
最完美的解決方案誕生了!
A君漸漸意識(shí)到設(shè)計(jì)一個(gè)分布式系統(tǒng)并沒(méi)有當(dāng)初預(yù)想的那么簡(jiǎn)單。要同時(shí)兼顧“一致性”和“可用性”真的很難做到嗎?也許對(duì)別人很難,但對(duì)于天性驕傲的A君來(lái)說(shuō),他當(dāng)然不服輸。
這不,幾經(jīng)思索,又一個(gè)清晨,一個(gè)別人做夢(mèng)都想不到的完美方案還是讓A君想到了,他再次興沖沖搖醒身旁熟睡的老婆大人。
“看!”,A君興高采烈,“采用下面這種做法,就能同時(shí)實(shí)現(xiàn)‘一致性’和‘可用性’了,雖然這做法和之前的很相似”:
?從現(xiàn)在開始,我們兩人無(wú)論誰(shuí)接到顧客的電話(有信息要求我們記錄),如果另一方這天處于開工狀態(tài),我們就通知對(duì)方本次更新信息。我們要在各自的筆記本上同時(shí)記錄這次更新信息,才算這個(gè)電話close file。
?如果另一方這天處于放工狀態(tài)(放假休息),我們就發(fā)電郵通知對(duì)方本次更新信息。
?第二天另一方收假回來(lái)準(zhǔn)備開工前,首先得檢查所有電郵,把休息這天落下的顧客“更新”信息在自己的筆記本上全部補(bǔ)上。然后再開始這新一天的第一通顧客來(lái)電。
“親愛的,你真是個(gè)天才!”A君的老婆拍手稱快,“現(xiàn)在我?guī)缀跽也怀鲞@個(gè)系統(tǒng)有任何缺陷了。我們馬上開始吧!”于是從這天起,“記憶公司”就能同時(shí)做到“一致性”和“可用性”了。
從這天起,“記憶公司”就能同時(shí)做到“一致性”和“可用性”了。
第六集
老婆大人在生氣!
一切進(jìn)行得很順利。A君的分布式系統(tǒng)不僅完美展示著“一致性”,而且即使哪天他們兩人中有一個(gè)放假休息,公司運(yùn)作絲毫無(wú)影響。但是有天老婆大人生氣了!即使兩人都在開工,她接到了顧客要求記錄信息的電話,卻因?yàn)樯鷲灇?,決定這一天都不告訴A君“更新“信息。這下完蛋了!到目前為止,一直保持“一致性”和“可用性”的完美系統(tǒng)卻因?yàn)闆](méi)有“分區(qū)容錯(cuò)性”瞬間崩潰!于是A君決定哄好老婆大人之前,他自己這邊不接任何顧客電話,于是在這段時(shí)間內(nèi),整個(gè)系統(tǒng)是失去“可用性”保障的。
第七集
總結(jié)的時(shí)間到了!
現(xiàn)在讓我們看回CAP理論,它主要是講,在設(shè)計(jì)一個(gè)分布式系統(tǒng)時(shí),無(wú)法同時(shí)兼顧“一致性”、“可用性”和“分區(qū)容錯(cuò)性”,你只能選擇成全其中的兩個(gè):
?一致性:顧客一旦致電過(guò)來(lái),要求記錄他的最新信息,那么在他下次索要信息時(shí),都必須第一時(shí)間將最新信息準(zhǔn)確告訴他,無(wú)論顧客回電間隔多么短。
?可用性:“記憶公司”一直保持良好的業(yè)務(wù)運(yùn)作,即使哪天A君和他老婆中有一個(gè)放假休息。
?分區(qū)容錯(cuò)性:“記憶公司”一直保持良好的業(yè)務(wù)運(yùn)作,即使哪天A君和他老婆之間發(fā)生冷戰(zhàn),一段時(shí)間內(nèi)拒絕溝通。
最后的彩蛋
招一個(gè)跑腿小弟入伙,實(shí)現(xiàn)終極“一致性”
如果招一個(gè)跑腿小弟入伙,當(dāng)A君和他老婆其中一方的筆記本有“更新”時(shí),這位小弟可以幫忙跑腿,迅速將他們夫妻中另一方的筆記本同步更新。這樣做最大的好處是,他是在后臺(tái)跑腿,于是接到“更新電話”的一方只要在前端繼續(xù)進(jìn)行他的業(yè)務(wù)即可,無(wú)需像之前那樣,可能得停下來(lái)等待另一方趕來(lái)和他“同步”更新筆記本。
很多NoSql系統(tǒng)就是這樣工作的,一個(gè)節(jié)點(diǎn)在本地更新,后端進(jìn)程將其更新信息同步更新到所有其它節(jié)點(diǎn)。唯一的問(wèn)題是,某些時(shí)候系統(tǒng)的“一致性”將得不到保障。
例如,當(dāng)老婆接到一個(gè)顧客電話要求記錄信息時(shí),跑腿小弟還沒(méi)來(lái)得及跑過(guò)來(lái)同步更新A君的筆記本,該顧客一個(gè)電話打到A君這里來(lái)了,這時(shí)他當(dāng)然不可能得到想要的最新信息……但如果這種情況只是小概率事件的話,招跑腿小弟入伙的想法還是很贊很贊的。你想啊,顧客的記性不會(huì)差到前腳“要求記錄信息”的電話剛掛斷,5分鐘后就回電詢問(wèn)“剛記錄的信息是什么”吧?!
分享到微信 ×
打開微信,點(diǎn)擊底部的“發(fā)現(xiàn)”,
使用“掃一掃”即可將網(wǎng)頁(yè)分享至朋友圈。