這樣的事情經(jīng)常在各個(gè)互聯(lián)網(wǎng)公司發(fā)生,我以電商系統(tǒng)舉一個(gè)簡(jiǎn)單的例子,A系統(tǒng)是一個(gè)活動(dòng)運(yùn)營(yíng)頁(yè)面,給用戶抽取優(yōu)惠券,B系統(tǒng)是用戶的訂單系統(tǒng),我們常常遇到這樣的場(chǎng)景,當(dāng)進(jìn)行一場(chǎng)運(yùn)營(yíng)活動(dòng)的時(shí)候,A系統(tǒng)的流量非常的大,最后把整個(gè)系統(tǒng)都拖垮了,造成用戶無(wú)法正常下單購(gòu)買。
可能有人就會(huì)問,我們通常不是把活動(dòng)系統(tǒng)跟訂單系統(tǒng)分開部署了么?怎么還會(huì)引起服務(wù)雪崩呢?

這是我們常見的系統(tǒng)部署的例子,雖然我們把不同的系統(tǒng)進(jìn)行分開部署,但卻把流量入口跟數(shù)據(jù)庫(kù)部署在同一個(gè)模塊,所以,但數(shù)據(jù)庫(kù)過載或者Proxy過載的時(shí)候,仍然無(wú)法有效的保護(hù)系統(tǒng)。
隔離設(shè)計(jì)
每一位架構(gòu)師、程序員、運(yùn)維工程師都必須懂得隔離設(shè)計(jì),隔離設(shè)置,源于輪船的設(shè)計(jì),在輪船設(shè)計(jì)中,我們常常會(huì)設(shè)計(jì)多個(gè)船艙,每個(gè)船艙都是獨(dú)立的空間,這樣子,當(dāng)輪船在行駛過程中,即便某個(gè)船艙遭受破壞進(jìn)水,也有船艙能夠正常工作。從而保證整個(gè)輪船不會(huì)沉沒。
在分布式系統(tǒng)中,隔離設(shè)計(jì)的實(shí)現(xiàn)有兩種不同的方式,一是系統(tǒng)隔離,二是用戶隔離。
系統(tǒng)隔離
在分布式系統(tǒng)中,我們常常把不同的模塊部署到不同的機(jī)器上面,避免不同的模塊彼此之間受到影響。(每臺(tái)計(jì)算機(jī)的資源都是有限的,特別是IO密集型、CPU密集型的模塊,容易拖垮其他業(yè)務(wù))。除此之外,我們還要對(duì)底層的存儲(chǔ)與上層的接入層進(jìn)行分離。在實(shí)際的應(yīng)用中,我們通常會(huì)對(duì)不同的不同業(yè)務(wù)的存儲(chǔ)進(jìn)行數(shù)據(jù)庫(kù)拆分,而在接入層,常常為了節(jié)約成本,而使用限流設(shè)計(jì)。

用戶隔離
另外一種方式,我們常常根據(jù)用戶進(jìn)行隔離,不同的用戶訪問不同的運(yùn)行實(shí)例。這種在大型互聯(lián)網(wǎng)公司也是非常常見的。例如阿里巴巴有北京、上海、杭州、深圳等多個(gè)不同的數(shù)據(jù)中心,不同的用戶訪問不同的系統(tǒng)實(shí)例。

不同的用戶群訪問不同的實(shí)力群,可以讓隔離做的更加徹底,但同時(shí)也是伴隨著非常大的挑戰(zhàn)。我們會(huì)面臨著存儲(chǔ)、不同實(shí)例間的通信等多種問題,我們后面會(huì)再次進(jìn)行分析跟學(xué)習(xí),歡迎大家關(guān)注我。
總結(jié)
好了,今天我們介紹到這里,隔離設(shè)計(jì),可以讓我們的系統(tǒng)更加穩(wěn)定,無(wú)論是程序員、架構(gòu)師、還是運(yùn)維,都是必備的計(jì)算機(jī)專業(yè)知識(shí)。歡迎大家關(guān)注我,整理后會(huì)和大家繼續(xù)分享。大家的支持是我繼續(xù)嘮嗑的動(dòng)力。同名公眾號(hào)(沙茶敏碎碎念)