分布式系統(tǒng)中的幾個(gè)理論

系統(tǒng)和架構(gòu)做的越多,就越覺(jué)得架構(gòu)是個(gè)取舍的藝術(shù)。沒(méi)有所謂的銀彈可以把很多問(wèn)題一次性解決掉,也就不糾結(jié)讓業(yè)務(wù)給你一個(gè)偏于理想的迭代節(jié)奏與業(yè)務(wù)保證業(yè)務(wù)怎樣怎樣。
前一段時(shí)間一個(gè)朋友說(shuō)了去快手面試的經(jīng)歷,背景應(yīng)該是讓做一個(gè)秒殺場(chǎng)景的系統(tǒng)設(shè)計(jì)。
朋友當(dāng)然說(shuō)了類似于“沒(méi)有明確場(chǎng)景的架構(gòu)設(shè)計(jì)都是耍流氓”,朋友的回答圍繞于流量漏斗、最終一致去回答,但面試官核心要求是100w tps打到了數(shù)據(jù)庫(kù)上你怎么解?
這個(gè)事情就很難搞,首先100w tps怎么來(lái)的?既然這么多流量都是真實(shí)流量,有狀態(tài)服務(wù)和存儲(chǔ)服務(wù)不具備足夠的容量可以支撐嗎?肯定要加機(jī)器。具體怎么解決流量過(guò)濾和數(shù)據(jù)一致肯定需要看具體場(chǎng)景,比如不同領(lǐng)域下的服務(wù)對(duì)于數(shù)據(jù)一致性容忍程度是不一樣的,背后肯定方案也不一樣。脫離業(yè)務(wù)場(chǎng)景談架構(gòu)果然是耍流氓,最后這個(gè)面試是不歡而散。
做秒殺架構(gòu)主要解決兩件事情,一個(gè)是高流量,一個(gè)是數(shù)據(jù)一致性。這兩個(gè)方向問(wèn)題回答好了,理論上就沒(méi)有問(wèn)題了。我自己做面試官心里當(dāng)然想候選人給我一個(gè)完備的方案,但是我也知道在有限的時(shí)間、有限的場(chǎng)景下,光靠嘴聊是很難聊得完備的,所以我一般觀察兩點(diǎn)。
一個(gè)是普世方的法論,就是有些事情是是永遠(yuǎn)做不到完美的,也不要期望做到完美,但是你需要告訴我為什么做不到完美,他的本質(zhì)是什么,怎么做到趨于完美。
第二個(gè)是看方案的完備性,什么意思呢?是希望候選人可以給出這個(gè)核心問(wèn)題之外的一些考慮,我個(gè)人理解是一種擴(kuò)展性的體現(xiàn),如果一個(gè)系統(tǒng)負(fù)責(zé)人不能考慮核心問(wèn)題之外的一些事情,系統(tǒng)的可靠性與擴(kuò)展性就很難提前規(guī)劃出來(lái),這樣的系統(tǒng)就變成了故障驅(qū)動(dòng)型系統(tǒng)了,就是出了問(wèn)題做次迭代,永遠(yuǎn)跟在故障之后擦屁股。
那在分布式系統(tǒng)下有哪些理論,可以幫助我們?cè)诩軜?gòu)中的方案更合理呢?
FLP理論
FLP理論說(shuō)的是不可能原理,原論文指出:在網(wǎng)絡(luò)可靠,但允許節(jié)點(diǎn)失效的最小化異步模型系統(tǒng)中,不存在一個(gè)可以解決一致性問(wèn)題的確定性共識(shí)算法。
簡(jiǎn)單來(lái)說(shuō),就是不要在分布式系統(tǒng)中的異步場(chǎng)景下浪費(fèi)時(shí)間去設(shè)計(jì)出所有場(chǎng)景都能實(shí)現(xiàn)共識(shí)的方案。
為什么呢?
在分布式架構(gòu)下,節(jié)點(diǎn)之間通信是異步的,如果一個(gè)節(jié)點(diǎn)進(jìn)程停止工作了,其他節(jié)點(diǎn)是不能確認(rèn)是消息延遲導(dǎo)致的,還是真的掛了,還是會(huì)嘗試進(jìn)行消息讀取。
FLP理論告訴我們,一致性算法的可靠性是無(wú)法保證的,不存在一個(gè)可以在異步網(wǎng)絡(luò)上容忍各種故障且保持一致性的分布式系統(tǒng)。
無(wú)論paxos還是raft,如果你想要安全,那么理論上都會(huì)產(chǎn)生無(wú)法表決通過(guò)的死循環(huán),每次的狀態(tài)變化都可能是當(dāng)前狀態(tài)的一種分支情況,所以在分布式系統(tǒng)中永遠(yuǎn)不能能達(dá)成單體應(yīng)用級(jí)別的一致性。
在現(xiàn)實(shí)場(chǎng)景中,我們采用TCP協(xié)議,保障消息健壯性、不重復(fù)、不亂序,每個(gè)節(jié)點(diǎn)通過(guò)NTP時(shí)鐘同步
CAP理論
CAP包括:一致性、可用性、分區(qū)容錯(cuò)性。
一致性:當(dāng)系統(tǒng)的更新操作成功并返回客戶端后,后續(xù)所有節(jié)點(diǎn)對(duì)于數(shù)據(jù)的訪問(wèn)應(yīng)該都可以獲取新值;
可用性:分布式系統(tǒng)可以正常對(duì)外提供服務(wù);
分區(qū)容錯(cuò)性:分布式系統(tǒng)遇到某些節(jié)點(diǎn)故障或網(wǎng)絡(luò)分區(qū)故障時(shí),仍可以對(duì)外提供服務(wù);
CAP理論告訴我們,在分布式系統(tǒng)下不能同時(shí)滿足一致性、可用性、分區(qū)容錯(cuò)性三個(gè)特性,只能取其二。而在分布式環(huán)境下,網(wǎng)絡(luò)問(wèn)題是需要滿足的,也就是P是需要的。所以大部分情況下關(guān)注于AP或CP即可。
BASE理論
BASE理論是對(duì)CAP理論的延伸,是對(duì)于CAP中強(qiáng)一致性的進(jìn)一步延伸,提供軟狀態(tài)、最終一致性。
BA(基本可用):在分布式系統(tǒng)出現(xiàn)故障時(shí),允許損失部分可用性,保障核心可用,比如電商雙十一時(shí),為滿足商品購(gòu)買(mǎi)鏈路的穩(wěn)定性,可以降級(jí)掉用戶修改地址這些功能。
S(軟狀態(tài)):允許系統(tǒng)之間出現(xiàn)中間狀態(tài),什么意思呢?不是簡(jiǎn)單的剛性成功 or 失敗,而是在分布式系統(tǒng)下多副本中出現(xiàn)中間狀態(tài),這種中間狀態(tài)是由于多個(gè)副本復(fù)制延遲導(dǎo)致的,比如mysql replication異步復(fù)制。
E(最終一致性):指的是系統(tǒng)中所有副本數(shù)據(jù)經(jīng)過(guò)一定時(shí)間之后,可以達(dá)到最終一致的狀態(tài)。
ACID原則
ACID是:原子性、一致性、隔離性、持久性。
概念包括:
原子性:每次操作是原子的,要么成功,要么失??;
一致性:是強(qiáng)一致性,沒(méi)有中間狀態(tài);
隔離性:各個(gè)操作彼此隔離,互不影響;
持久性:數(shù)據(jù)狀態(tài)一旦提交,是持久的,不會(huì)失效;
ACID一般用于關(guān)系數(shù)據(jù)庫(kù)的事務(wù)定義,追求的是強(qiáng)一致性;
BASE是在分布式系統(tǒng)下,犧牲掉對(duì)于一致性的約束,以最終一致性的方式提供一致性,換取性能和可用性;
兩種方案是完全相反的設(shè)計(jì)哲學(xué),具體怎么用就需要看場(chǎng)景了。
所以架構(gòu)是取舍的藝術(shù),脫離場(chǎng)景談架構(gòu)都是耍流氓,先基于場(chǎng)景,畫(huà)一個(gè)框,在框內(nèi)找到一個(gè)確定性的問(wèn)題,找到這個(gè)問(wèn)題的本質(zhì),給出合適的解。
其他分布式原理,詳見(jiàn):

