微服務(wù)的風(fēng)險(xiǎn):分布式固有的復(fù)雜性、服務(wù)的依賴性及雪崩效應(yīng)
上文給大家介紹的內(nèi)容是微服務(wù)容錯(cuò)與隔離:隔離機(jī)制,那么本文就給大家來(lái)介紹微服務(wù)容錯(cuò)與隔離:微服務(wù)的風(fēng)險(xiǎn);
微服務(wù)的風(fēng)險(xiǎn)
在微服務(wù)架構(gòu)下,傳統(tǒng)的單體應(yīng)用被拆分為多個(gè)服務(wù)后,服務(wù)的數(shù)量變多了,同時(shí)之前單體架構(gòu)下進(jìn)程內(nèi)部的方法調(diào)用轉(zhuǎn)變?yōu)榉植际骄W(wǎng)絡(luò)環(huán)境下的遠(yuǎn)程調(diào)用,因此構(gòu)建分布式微服務(wù)系統(tǒng)帶來(lái)了額外的開(kāi)銷。
● 性能:分布式系統(tǒng)是跨進(jìn)程、跨網(wǎng)絡(luò)的調(diào)用,受網(wǎng)絡(luò)延遲和帶寬的影響。
● 可靠性:由于高度依賴于網(wǎng)絡(luò)狀況,任何一次的遠(yuǎn)程調(diào)用都有可能失敗,隨著服務(wù)的增多還會(huì)出現(xiàn)更多的潛在故障點(diǎn)。因此,如何提高系統(tǒng)的可靠性、降低因網(wǎng)絡(luò)導(dǎo)致的故障率是系統(tǒng)構(gòu)建的一大挑戰(zhàn)。
● 異步:異步通信大大增加了功能實(shí)現(xiàn)的復(fù)雜度,并且有定位難、調(diào)試難等問(wèn)題。
● 數(shù)據(jù)一致性:要保證分布式系統(tǒng)的數(shù)據(jù)強(qiáng)一致性成本是非常高的,需要在C(一致性)、A(可用性)、P(分區(qū)容錯(cuò)性)三者之間做出權(quán)衡。
下面是微服務(wù)場(chǎng)景下我們會(huì)面臨的常見(jiàn)風(fēng)險(xiǎn)。
分布式固有的復(fù)雜性
分 布 式 系 統(tǒng) 的 CAP 理 論 告 訴 我 們 分 區(qū) 容 錯(cuò) ( PartitionTolerance)是不可避免的。如下圖所示,G1和G2是兩臺(tái)分布式跨網(wǎng)絡(luò)的服務(wù)器,G1向G2發(fā)送一條信息,G2可能無(wú)法收到。所以,對(duì)于分布式系統(tǒng),只要具有大于零的概率,根據(jù)墨菲定律你就不能避免它發(fā)生。

分布式系統(tǒng)中多個(gè)計(jì)算機(jī)在進(jìn)行通信過(guò)程中,由于網(wǎng)絡(luò)的不可靠性,每次網(wǎng)絡(luò)通信都會(huì)伴隨網(wǎng)絡(luò)不可用的風(fēng)險(xiǎn)。即便網(wǎng)絡(luò)通信正常,服務(wù)的延遲也會(huì)遠(yuǎn)遠(yuǎn)大于單機(jī)下的調(diào)用延遲。所以消息丟失或者延遲是非常普遍的情況。
基于上述分析,我們?cè)谶M(jìn)行微服務(wù)系統(tǒng)架構(gòu)設(shè)計(jì)的時(shí)候,就必須考慮當(dāng)網(wǎng)絡(luò)分區(qū)出現(xiàn)時(shí),分布式系統(tǒng)就會(huì)出現(xiàn)局部服務(wù)失效問(wèn)題,我們需要做出相應(yīng)的服務(wù)容錯(cuò)處理。
服務(wù)的依賴性
在微服務(wù)架構(gòu)場(chǎng)景下,除了微服務(wù)自身缺陷造成的服務(wù)不可用,對(duì)基礎(chǔ)設(shè)施的依賴、對(duì)上下游微服務(wù)的依賴都可能造成依賴錯(cuò)誤的發(fā)生。相比服務(wù)自身失敗而言,服務(wù)對(duì)外部平臺(tái)的依賴往往更加難以發(fā)現(xiàn)和處理,服務(wù)依賴失敗也是在設(shè)計(jì)微服務(wù)時(shí)需要重點(diǎn)考慮的失敗因素。同時(shí),細(xì)粒度的服務(wù)也增加了不同服務(wù)之間的依賴和級(jí)聯(lián)影響,因?yàn)榉?wù)依賴失敗而造成的失敗擴(kuò)散,或者核心服務(wù)對(duì)非核心業(yè)務(wù)的依賴,都會(huì)造成依賴風(fēng)險(xiǎn)。
雪崩效應(yīng)
我們常把“基礎(chǔ)服務(wù)故障”導(dǎo)致“級(jí)聯(lián)故障”的現(xiàn)象稱為雪崩效應(yīng)。雪崩效應(yīng)描述的是服務(wù)生產(chǎn)者不可用導(dǎo)致消費(fèi)者不可用,并將不可用逐漸放大的過(guò)程。
軟件系統(tǒng)會(huì)發(fā)生各種錯(cuò)誤,如硬件設(shè)施的損壞、軟件系統(tǒng)內(nèi)存溢出和資源的OOM等問(wèn)題,在微服務(wù)架構(gòu)下,我們可能還會(huì)遇到的問(wèn)題就是雪崩效應(yīng)。微服務(wù)架構(gòu)的應(yīng)用系統(tǒng)通常包含多個(gè)服務(wù)層。微服務(wù)之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信,從而支撐起整個(gè)應(yīng)用系統(tǒng),因此微服務(wù)之間難免存在依賴關(guān)系。在公司內(nèi)部的網(wǎng)絡(luò)拓?fù)渲校覀儠?huì)發(fā)現(xiàn)一個(gè)HTTP服務(wù)的請(qǐng)求往往會(huì)經(jīng)歷很多個(gè)服務(wù)節(jié)點(diǎn),例如,一個(gè)電商平臺(tái)的下單場(chǎng)景往往會(huì)經(jīng)過(guò)如下鏈路:App客戶端→API網(wǎng)關(guān)→賬單服務(wù)→支付服務(wù)→庫(kù)存服務(wù)。但是,在錯(cuò)綜復(fù)雜的網(wǎng)絡(luò)中各式各樣的問(wèn)題(硬件原因、軟件原因)都會(huì)造成系統(tǒng)異常,難免有些請(qǐng)求會(huì)失敗,雪崩效應(yīng)就此產(chǎn)生。
● 硬件故障:比如宕機(jī)、機(jī)房斷電、光纖被挖斷等。
● 流量激增:比如異常流量或者用戶重試導(dǎo)致的系統(tǒng)負(fù)載升高。
● 程序Bug:比如代碼循環(huán)調(diào)用的邏輯問(wèn)題、資源未釋放引起的內(nèi)存泄漏問(wèn)題等。
● 線程同步等待:系統(tǒng)間經(jīng)常采用同步服務(wù)調(diào)用模式,核心服務(wù)和非核心服務(wù)共用一個(gè)線程池和消息隊(duì)列,如果一個(gè)核心業(yè)務(wù)線程調(diào)用非核心線程,這個(gè)非核心線程交由第三方系統(tǒng)完成,當(dāng)?shù)谌较到y(tǒng)本身出現(xiàn)問(wèn)題時(shí),導(dǎo)致核心線程阻塞,一直處于等待狀態(tài),而進(jìn)程間的調(diào)用是有超時(shí)限制的,最終這條線程將斷掉,引發(fā)雪崩效應(yīng)。
總之,面對(duì)微服務(wù)架構(gòu)場(chǎng)景下的風(fēng)險(xiǎn),我們需要一定的應(yīng)對(duì)措施和容錯(cuò)策略,下面是我們總結(jié)的容錯(cuò)管理的主要原則:
● 按照進(jìn)程或者線程進(jìn)行軟件的劃分和隔離。
● 將錯(cuò)誤限制在可以快速失敗(fail-fast)的軟件模塊中,避免錯(cuò)誤模塊對(duì)整體系統(tǒng)造成影響。
● 使用備份機(jī)制或者集群方式應(yīng)對(duì)硬件或者軟件的故障。
本文給大家講解的內(nèi)容是微服務(wù)容錯(cuò)與隔離:微服務(wù)的風(fēng)險(xiǎn)
下篇文章給大家講解的內(nèi)容是微服務(wù)容錯(cuò)與隔離:降級(jí)保護(hù)
覺(jué)得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;
感謝大家的支持!
