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

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

