十分鐘看懂分布式架構(gòu)的前世今生
對(duì)于每一個(gè)程序員來說,大家一聽分布式架構(gòu),一般第一反應(yīng)都是,高端霸氣上檔次。例如阿里巴巴的各個(gè)系統(tǒng)都部署在不同的機(jī)器上,并且還分布在杭州、上海、深圳等不同的服務(wù)器上。華為的服務(wù)器也會(huì)分布在世界不同的區(qū)域,從而保證滿足全球用戶的使用。
我們常常在各種招聘廣告上面看到,熟悉分布式系統(tǒng)的開發(fā),那么,分布式究竟是怎么一回事,這么講,小孩子都能聽懂。
背景
有人認(rèn)為,分布式就是分模塊進(jìn)行開發(fā),分模塊進(jìn)行部署,分布式的核心就是分模塊。但分模塊并不是分布式的概念,早在上世紀(jì)90年代,就有人提出了按照模塊劃分軟件功能。這在軟件工程上,分模塊可以更好地進(jìn)行解耦,在工作中,分模塊也可以更好地進(jìn)行分工。雖然分模塊進(jìn)行開發(fā),但是他們?nèi)匀徊渴鹪谙嗤臋C(jī)器上。隨著軟件的發(fā)展尤其是互聯(lián)網(wǎng)的發(fā)展,傳統(tǒng)的單體架構(gòu)越來越不行了,主要表現(xiàn)為以下三個(gè)方面:
- 性能問題,在早起的互聯(lián)網(wǎng)行業(yè)中,硬件的發(fā)展非常迅速,幾乎每一代新的電腦芯片,都能比上一代性能翻一番,但是,隨著摩爾定律的失效,硬件的提升已經(jīng)更不上軟件行業(yè)的發(fā)展,我們常常說因特爾擠牙膏,因?yàn)楝F(xiàn)在芯片的性能要翻一番需要好幾代產(chǎn)品了。所以,單體的架構(gòu)的性能問題就爆發(fā)出來,無法跟上時(shí)代的腳步。
- 難以擴(kuò)展,原來各個(gè)模塊上只是邏輯上的隔離,但仍然部署在同一臺(tái)機(jī)器。各個(gè)模塊之間,用著永洋的物理內(nèi)存,同樣的硬盤,同樣的網(wǎng)卡,實(shí)際上各個(gè)模塊依賴非常密切,就像一臺(tái)精密的機(jī)器,有成千上萬個(gè)齒輪,每一個(gè)模塊的變動(dòng)都會(huì)帶動(dòng)其他齒輪的轉(zhuǎn)動(dòng)。
- 系統(tǒng)可用性低,不難想象,所有的模塊都不熟在同一個(gè)機(jī)器上,如果有一個(gè)模塊出問題,例如突然占滿整個(gè)磁盤、或者內(nèi)存泄漏,都會(huì)影響系統(tǒng)上的其他模塊,從而造成整個(gè)系統(tǒng)的崩潰。

特點(diǎn)

相對(duì)于傳統(tǒng)的單體結(jié)構(gòu),分布式的最重要的有點(diǎn)有下面幾點(diǎn):
- 更容易開發(fā)跟實(shí)現(xiàn)新功能,在傳統(tǒng)的單體結(jié)構(gòu)中,模塊之間的依賴是非常嚴(yán)重的,你要實(shí)現(xiàn)一個(gè)功能,還需要評(píng)估對(duì)其他模塊的影響。而在分布式的設(shè)計(jì)中,模塊與模塊之間,是通過接口來進(jìn)行交互,一個(gè)模塊的內(nèi)部實(shí)現(xiàn)對(duì)另外的模塊來說是透明的,影響更小。
- 單點(diǎn)故障的影響氛圍更小,傳統(tǒng)的單體架構(gòu)的存在的一個(gè)嚴(yán)重問題,就是一個(gè)模塊的故障容易引起整個(gè)系統(tǒng)不可用。舉個(gè)簡(jiǎn)單的例子,在電商系統(tǒng)中,評(píng)價(jià)系統(tǒng)可能不是那么重要,結(jié)果有一天評(píng)價(jià)系統(tǒng)故障內(nèi)存泄漏,造成機(jī)器不斷重啟,就非常可能影響部署在同一臺(tái)機(jī)器上的其他應(yīng)用。分布式部署則可以大大地降低故障的概率,當(dāng)然,分布式也會(huì)有故障問題,這就需要優(yōu)秀的分布式架構(gòu)師設(shè)置合理合適的框架,合理地進(jìn)行部署,來規(guī)避單點(diǎn)故障帶來的大面積故障。
- 系統(tǒng)吞吐量更大,以往的單點(diǎn)部署模塊,受限于單臺(tái)機(jī)器的性能。在分布式架構(gòu)中,對(duì)于有性能瓶頸的模塊,我們可以采用異步或者部署更多的機(jī)器,解決單機(jī)性能瓶頸的問題又提高了機(jī)器的利用率。舉個(gè)簡(jiǎn)單的例子,數(shù)據(jù)庫模塊,對(duì)磁盤的性能及容量要求更高,我們可以部署在磁盤更好的機(jī)器,對(duì)于緩存這種對(duì)CPU、內(nèi)存容量要求更高的機(jī)器,從而達(dá)到機(jī)器更高的利用率。
分布式雖然解決了很多難題,但也是有不少缺點(diǎn)與難點(diǎn)的,所以需要各位程序員,各位架構(gòu)師進(jìn)行攻克與架構(gòu)。
主要難點(diǎn)
- 異構(gòu)系統(tǒng)標(biāo)準(zhǔn)不統(tǒng)一,在分布式系統(tǒng)中,每個(gè)模塊都可以選擇自己的開發(fā)語言,部署環(huán)境,每個(gè)系統(tǒng)都可以選擇自身的數(shù)據(jù)結(jié)構(gòu)與通信協(xié)議。可能有人喜歡用HTTP協(xié)議進(jìn)行通信,有人是是google公司的gRPC,有人是Twitter公司的thrift。而且協(xié)議體、錯(cuò)誤代碼、錯(cuò)誤信息等數(shù)據(jù)結(jié)構(gòu)都可能不一致,這不僅給開發(fā)帶來不便,還給統(tǒng)一監(jiān)控跟治理帶來不少麻煩。
- 故障概率更大,因?yàn)闄C(jī)器數(shù)量變多,單機(jī)的性能與質(zhì)量可能就沒之前的那么好了,同時(shí)維護(hù)開發(fā)的人變多,單機(jī)故障的概率反而會(huì)大于單機(jī)結(jié)構(gòu)。這是必然的現(xiàn)象,一個(gè)沒有處理過故障的工程師不是一個(gè)好碼農(nóng)。這就需要我們?cè)O(shè)計(jì)合理的分布式架構(gòu),降低故障的概率跟影響面,同時(shí)也要自動(dòng)化運(yùn)維,畢竟人總是會(huì)犯錯(cuò)的,而且經(jīng)常犯。
- 服務(wù)依賴問題,不要以為一臺(tái)機(jī)器掛了整個(gè)程序就掛了只有在單體架構(gòu)才會(huì)發(fā)生,在分布式的環(huán)境中,也會(huì)存在一些關(guān)鍵服務(wù),一旦掛掉,往往會(huì)行程多米諾效應(yīng),造成雪崩。例如聊天軟件中維護(hù)用戶登錄態(tài)的Session服務(wù),如果一旦故障,那么所有的服務(wù)都可能丟失登錄態(tài),從而造成整個(gè)服務(wù)不可用。
怎么做
為了解決分布式帶來的問題,就需要各個(gè)程序員跟架構(gòu)師大展身手了,無論是什么辦法,無外乎為了下面兩個(gè)事情:
- 是提高系統(tǒng)吞吐,
- 是提高系統(tǒng)的可用性。






























