(搬運(yùn))微服務(wù)熔斷與隔離

? ? ? ? 微服務(wù)是當(dāng)前業(yè)界的一個(gè)趨勢(shì),其原理是將職責(zé)單一的功能獨(dú)立化成子服務(wù),一個(gè)后臺(tái)服務(wù)依賴多個(gè)微服務(wù)。假設(shè)某服務(wù)由30個(gè)微服務(wù)組成,每個(gè)微服務(wù)的可用性是99.99%,那么99.99%的30次方≈99.7%,也就是說(shuō)有0.3%的請(qǐng)求會(huì)失敗,若有一億次請(qǐng)求則有300000次失敗。熔斷隔離就是為服務(wù)穩(wěn)定性而生。

1、什么是微服務(wù)

? ? ? ? 對(duì)于微服務(wù),我們可以簡(jiǎn)單的理解成對(duì)一個(gè)服務(wù)解耦,以降低業(yè)務(wù)系統(tǒng)的復(fù)雜性,將服務(wù)系統(tǒng)中的功能進(jìn)行拆分成多個(gè)輕量的子服務(wù),各個(gè)自服務(wù)間通過(guò)RPC實(shí)現(xiàn)服務(wù)間的關(guān)聯(lián),這樣做的好處是將業(yè)務(wù)簡(jiǎn)單化,每個(gè)子服務(wù)可以有自己獨(dú)立的編程語(yǔ)言,模式等且能夠獨(dú)立維護(hù),獨(dú)立部署,功能復(fù)用。

2、為什么需要做服務(wù)隔離與熔斷

? ? ? ? 由于微服務(wù)間通過(guò)RPC來(lái)進(jìn)行數(shù)據(jù)交換,所以我們可以做一個(gè)假設(shè):在IO型服務(wù)中,假設(shè)服務(wù)A依賴服務(wù)B和服務(wù)C,而B(niǎo)服務(wù)和C服務(wù)有可能繼續(xù)依賴其他的服務(wù),繼續(xù)下去會(huì)使得調(diào)用鏈路過(guò)長(zhǎng),技術(shù)上稱1->N扇出。如果在A的鏈路上某個(gè)或幾個(gè)被調(diào)用的子服務(wù)不可用或延遲較高,則會(huì)導(dǎo)致調(diào)用A服務(wù)的請(qǐng)求被堵住,堵住的請(qǐng)求會(huì)消耗占用掉系統(tǒng)的線程、io等資源,當(dāng)該類請(qǐng)求越來(lái)越多,占用的計(jì)算機(jī)資源越來(lái)越多的時(shí)候,會(huì)導(dǎo)致系統(tǒng)瓶頸出現(xiàn),造成其他的請(qǐng)求同樣不可用,最終導(dǎo)致業(yè)務(wù)系統(tǒng)崩潰,又稱:雪崩效應(yīng)。

1 -> N 扇形
雪崩效應(yīng)

3、服務(wù)雪崩的原因

(1)某幾個(gè)機(jī)器故障:例如機(jī)器的硬驅(qū)動(dòng)引起的錯(cuò)誤,或者一些特定的機(jī)器上出現(xiàn)一些的bug(如,內(nèi)存中斷或者死鎖)。

(2)服務(wù)器負(fù)載發(fā)生變化:某些時(shí)候服務(wù)會(huì)因?yàn)橛脩粜袨樵斐烧?qǐng)求無(wú)法及時(shí)處理從而導(dǎo)致雪崩,例如阿里的雙十一活動(dòng),若沒(méi)有提前增加機(jī)器預(yù)估流量則會(huì)造服務(wù)器壓力會(huì)驟然增大而掛掉。

(3)人為因素:比如代碼中的路徑在某個(gè)時(shí)候出現(xiàn)bug

4、解決或緩解服務(wù)雪崩的方案

一般情況對(duì)于服務(wù)依賴的保護(hù)主要有3中解決方案:

(1)熔斷模式:這種模式主要是參考電路熔斷,如果一條線路電壓過(guò)高,保險(xiǎn)絲會(huì)熔斷,防止火災(zāi)。放到我們的系統(tǒng)中,如果某個(gè)目標(biāo)服務(wù)調(diào)用慢或者有大量超時(shí),此時(shí),熔斷該服務(wù)的調(diào)用,對(duì)于后續(xù)調(diào)用請(qǐng)求,不在繼續(xù)調(diào)用目標(biāo)服務(wù),直接返回,快速釋放資源。如果目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。

(2)隔離模式:這種模式就像對(duì)系統(tǒng)請(qǐng)求按類型劃分成一個(gè)個(gè)小島的一樣,當(dāng)某個(gè)小島被火少光了,不會(huì)影響到其他的小島。例如可以對(duì)不同類型的請(qǐng)求使用線程池來(lái)資源隔離,每種類型的請(qǐng)求互不影響,如果一種類型的請(qǐng)求線程資源耗盡,則對(duì)后續(xù)的該類型請(qǐng)求直接返回,不再調(diào)用后續(xù)資源。這種模式使用場(chǎng)景非常多,例如將一個(gè)服務(wù)拆開(kāi),對(duì)于重要的服務(wù)使用單獨(dú)服務(wù)器來(lái)部署,再或者公司最近推廣的多中心。

(3)限流模式:上述的熔斷模式和隔離模式都屬于出錯(cuò)后的容錯(cuò)處理機(jī)制,而限流模式則可以稱為預(yù)防模式。限流模式主要是提前對(duì)各個(gè)類型的請(qǐng)求設(shè)置最高的QPS閾值,若高于設(shè)置的閾值則對(duì)該請(qǐng)求直接返回,不再調(diào)用后續(xù)資源。這種模式不能解決服務(wù)依賴的問(wèn)題,只能解決系統(tǒng)整體資源分配問(wèn)題,因?yàn)闆](méi)有被限流的請(qǐng)求依然有可能造成雪崩效應(yīng)。

5、熔斷設(shè)計(jì)

在熔斷的設(shè)計(jì)主要參考了hystrix的做法。其中最重要的是三個(gè)模塊:熔斷請(qǐng)求判斷算法、熔斷恢復(fù)機(jī)制、熔斷報(bào)警

(1)熔斷請(qǐng)求判斷機(jī)制算法:使用無(wú)鎖循環(huán)隊(duì)列計(jì)數(shù),每個(gè)熔斷器默認(rèn)維護(hù)10個(gè)bucket,每1秒一個(gè)bucket,每個(gè)blucket記錄請(qǐng)求的成功、失敗、超時(shí)、拒絕的狀態(tài),默認(rèn)錯(cuò)誤超過(guò)50%且10秒內(nèi)超過(guò)20個(gè)請(qǐng)求進(jìn)行中斷攔截。

(2)熔斷恢復(fù):對(duì)于被熔斷的請(qǐng)求,每隔5s允許部分請(qǐng)求通過(guò),若請(qǐng)求都是健康的(RT<250ms)則對(duì)請(qǐng)求健康恢復(fù)。

(3)熔斷報(bào)警:對(duì)于熔斷的請(qǐng)求打日志,異常請(qǐng)求超過(guò)某些設(shè)定則報(bào)警

6、隔離設(shè)計(jì)

隔離的方式一般使用兩種

(1)線程池隔離模式:使用一個(gè)線程池來(lái)存儲(chǔ)當(dāng)前的請(qǐng)求,線程池對(duì)請(qǐng)求作處理,設(shè)置任務(wù)返回處理超時(shí)時(shí)間,堆積的請(qǐng)求堆積入線程池隊(duì)列。這種方式需要為每個(gè)依賴的服務(wù)申請(qǐng)線程池,有一定的資源消耗,好處是可以應(yīng)對(duì)突發(fā)流量(流量洪峰來(lái)臨時(shí),處理不完可將數(shù)據(jù)存儲(chǔ)到線程池隊(duì)里慢慢處理)

(2)信號(hào)量隔離模式:使用一個(gè)原子計(jì)數(shù)器(或信號(hào)量)來(lái)記錄當(dāng)前有多少個(gè)線程在運(yùn)行,請(qǐng)求來(lái)先判斷計(jì)數(shù)器的數(shù)值,若超過(guò)設(shè)置的最大線程個(gè)數(shù)則丟棄改類型的新請(qǐng)求,若不超過(guò)則執(zhí)行計(jì)數(shù)操作請(qǐng)求來(lái)計(jì)數(shù)器+1,請(qǐng)求返回計(jì)數(shù)器-1。這種方式是嚴(yán)格的控制線程且立即返回模式,無(wú)法應(yīng)對(duì)突發(fā)流量(流量洪峰來(lái)臨時(shí),處理的線程超過(guò)數(shù)量,其他的請(qǐng)求會(huì)直接返回,不繼續(xù)去請(qǐng)求依賴的服務(wù))

7、超時(shí)機(jī)制設(shè)計(jì)

超時(shí)分兩種,一種是請(qǐng)求的等待超時(shí),一種是請(qǐng)求運(yùn)行超時(shí)。

(1)等待超時(shí):在任務(wù)入隊(duì)列時(shí)設(shè)置任務(wù)入隊(duì)列時(shí)間,并判斷隊(duì)頭的任務(wù)入隊(duì)列時(shí)間是否大于超時(shí)時(shí)間,超過(guò)則丟棄任務(wù)。

(2)運(yùn)行超時(shí):直接可使用線程池提供的get方法

參考:

在設(shè)計(jì)和實(shí)現(xiàn)的過(guò)程中參考了一些現(xiàn)有的設(shè)計(jì)和一些文章:

1. Hystrix官方文檔:https://github.com/Netflix/Hystrix/wiki

2. Hystrix使用與分析:http://hot66hot.iteye.com/blog/2155036

3. Facebook文章:http://queue.acm.org/detail.cfm?id=2839461

4. Facebook文章:http://queue.acm.org/detail.cfm?id=2209336

5. 分布式服務(wù)容錯(cuò)模式和實(shí)踐:http://www.atatech.org/articles/31559

6. https://my.oschina.net/yu120/blog/664747

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容