微服務(wù)架構(gòu)之雪崩效應(yīng)

? ?
一、概述
二、原因
三、解決方案
四、總結(jié)

在密碼學(xué)中,雪崩效應(yīng)(avalanche effect)指加密算法(尤其是塊密碼和加密散列函數(shù))的一種理想屬性。雪崩效應(yīng)是指當(dāng)輸入發(fā)生最微小的改變(例如,反轉(zhuǎn)一個(gè)二進(jìn)制位)時(shí),也會導(dǎo)致輸出的不可區(qū)分性改變(輸出中每個(gè)二進(jìn)制位有50%的概率發(fā)生反轉(zhuǎn))。合格塊密碼中,無論密鑰或明文的任何細(xì)微變化都必須引起密文的不可區(qū)分性改變。該術(shù)語最早由Horst Feistel使用,[1]盡管其概念最早可以追溯到克勞德·香農(nóng)提出的擴(kuò)散(diffusion)。
- 維基百科
那么,在微服務(wù)體系中,雪崩效應(yīng)又指的是什么呢?
在微服務(wù)系統(tǒng)中,整個(gè)系統(tǒng)是以一系列固有功能的微服務(wù)組成,如果某一個(gè)服務(wù),因?yàn)榱髁慨惓;蛘咂渌?,?dǎo)致響應(yīng)異常,那么同樣的也會影響到調(diào)用該服務(wù)的其他服務(wù),從而引起了一系列連鎖反應(yīng),最終導(dǎo)致整個(gè)系統(tǒng)崩潰。

如上圖所示,服務(wù)A、B、C串行調(diào)用,如果在某一時(shí)刻,ServerC出現(xiàn)異常,且暫時(shí)沒有恢復(fù),那么逐漸的,ServerB和ServerA也會出現(xiàn)異常,從而使得整個(gè)調(diào)用鏈異常,不能正常提供服務(wù)。
常見的原因如下:
流量突增
節(jié)假日訪問量變大,常見于工具類APP,如美圖秀秀
活動(dòng)原因?qū)е略L問量變大
程序bug
內(nèi)存泄漏
線程池中的線程使用之后未釋放等
硬件或者網(wǎng)絡(luò)異常
機(jī)器硬盤故障
所在的網(wǎng)段發(fā)生異常
同步等待
因?yàn)槌绦蛟O(shè)計(jì)原因,整個(gè)請求都在同步進(jìn)行,后面的請求只有在前面的請求完成之后,才能被執(zhí)行
緩存擊穿
常見于秒殺系統(tǒng)或者熱門事件,短時(shí)間內(nèi)大量緩存失效時(shí)大量的緩存不命中,使請求直擊后端,造成服務(wù)提供者超負(fù)荷運(yùn)行,引起服務(wù)不可用。
在正常情況下,整個(gè)微服務(wù)系統(tǒng)運(yùn)行正常(以綠色表示),如下圖所示:

在某一時(shí)刻,serverE出現(xiàn)了異常,如下圖所示:

因?yàn)榉?wù)E的異常,導(dǎo)致serverD在接收和處理請求上面也出現(xiàn)了異常,如下圖:

久而久之,因?yàn)閟erverD的異常,也影響了serverA、serverB和serverC。也就是說因?yàn)閟erverE的異常,間接影響了serverA、serverB、serverC和serverD,從而整個(gè)系統(tǒng)出現(xiàn)了崩潰,這就是所謂的雪崩效應(yīng)。
微服務(wù)系統(tǒng),是一個(gè)復(fù)雜的系統(tǒng),呈網(wǎng)狀調(diào)用結(jié)構(gòu),其每個(gè)微服務(wù)的實(shí)例成百上千,很難或者不可能去完全避免某個(gè)實(shí)例出現(xiàn)異常,這就使得異常在某個(gè)特定情況或者特定壓力下才會出現(xiàn),那么避免雪崩效應(yīng),除了要求開發(fā)人員有扎實(shí)的開發(fā)功底外,還得需要依賴其他方式來有效的進(jìn)行避免或者應(yīng)對雪崩效應(yīng)。
通過限制調(diào)用端的流量數(shù)來達(dá)到限流的目的。比如控制實(shí)例每秒鐘的處理請求量,即控制QPS。常見的QPS控制方法有令牌桶算法,如下圖所示(圖片來自于網(wǎng)絡(luò))

在調(diào)用端即上游服務(wù)控制對下游服務(wù)的熔斷功能,在上游服務(wù)中,如果發(fā)現(xiàn)下游服務(wù)在一定時(shí)間內(nèi),其超時(shí)率達(dá)到了某個(gè)閾值,則開啟熔斷機(jī)制,即不對下游服務(wù)進(jìn)行調(diào)用,或者只進(jìn)行一定比例的調(diào)用,而對于剩下的流量,則直接返回空響應(yīng)或者返回默認(rèn)響應(yīng)。

分為服務(wù)內(nèi)降級和服務(wù)外降級兩種。
服務(wù)內(nèi)降級:指的是當(dāng)本服務(wù)響應(yīng)比較慢的時(shí)候,主動(dòng)停掉本服務(wù)內(nèi)一些不重要的業(yè)務(wù),從而釋放機(jī)器資源給重要的業(yè)務(wù)。
服務(wù)外降級:當(dāng)下游服務(wù)響應(yīng)慢或者無響應(yīng)的時(shí)候,上游服務(wù)主動(dòng)調(diào)用備用邏輯,停掉對下游服務(wù)的調(diào)用。
如下圖所示,當(dāng)serverD異常的時(shí)候,斷開serverA對serverD的調(diào)用。

在流量突增的時(shí)候,微服務(wù)系統(tǒng)內(nèi)某個(gè)實(shí)例因?yàn)闄C(jī)器資源或者別的原因,響應(yīng)比較慢,這就是需要對該實(shí)例進(jìn)行臨時(shí)擴(kuò)容,現(xiàn)在擴(kuò)容方案比較成熟,比如docker方式等等,具體依賴于服務(wù)的實(shí)際部署方式,此處不再贅述。
對下游服務(wù)正常響應(yīng)的數(shù)據(jù)進(jìn)行緩存,之后一段時(shí)間內(nèi)直接向上游返回緩存中的數(shù)據(jù)。這樣可以有效降低對下游服務(wù)質(zhì)量的敏感度,在一定程度上提升服務(wù)的穩(wěn)定性。
評估服務(wù)的最大并發(fā),在上線之前,先對服務(wù)進(jìn)行壓測,了解其性能以及QPS等,無論程序是同步還是異步,用戶都可以通過?最大QPS * 非擁塞時(shí)的延時(shí)(秒)來評估最大并發(fā),原理見little's law。
雪崩效應(yīng),在微服務(wù)系統(tǒng)中,是一個(gè)很常見的現(xiàn)象,對于其解決或者避免方式,每個(gè)開發(fā)人員的理解見仁見智,但方案無非就是以上幾種,具體使用哪種,則依賴于具體的場景。
比如,筆者從業(yè)于某互聯(lián)網(wǎng)公司的廣告相關(guān)業(yè)務(wù),在節(jié)假日的時(shí)候,流量會較平時(shí)增加,也遇到過因?yàn)榱髁孔兇髮?dǎo)致的整個(gè)系統(tǒng)短時(shí)間內(nèi)訪問異常的情況,解決方案有以下幾種:
1、提前擴(kuò)容,針對可能存在性能瓶頸的服務(wù)實(shí)例,節(jié)前提前擴(kuò)容,做到臨時(shí)以防萬一。
2、服務(wù)降級,對于廣告業(yè)務(wù)線中收入占比不是很大或者耗時(shí)比較久的業(yè)務(wù),不對其進(jìn)行調(diào)用或者降低調(diào)用請求量從而使得整個(gè)系統(tǒng)的rt盡可能的小,以能夠接受更多的請求去處理重要業(yè)務(wù)線
3、其他

