解密微服務(wù)雪崩:保護(hù)您的應(yīng)用免受災(zāi)難性故障的威脅
今日目標(biāo)
- 了解雪崩產(chǎn)生的原因
- 理解常見解決方案
隨著微服務(wù)架構(gòu)的廣泛應(yīng)用,應(yīng)用程序的復(fù)雜性已經(jīng)得到了顯著提高,但與之同時,微服務(wù)雪崩問題也開始引起廣泛關(guān)注。微服務(wù)雪崩是指在微服務(wù)架構(gòu)中,一個或多個微服務(wù)出現(xiàn)故障或不可用時,導(dǎo)致整個系統(tǒng)的不穩(wěn)定甚至崩潰。本文將介紹微服務(wù)雪崩的產(chǎn)生原因以及一些常見的解決方案。
1. 雪崩介紹
微服務(wù)中,服務(wù)間調(diào)用關(guān)系錯綜復(fù)雜,一個微服務(wù)往往依賴于多個其它微服務(wù)。
圖片
如圖,如果服務(wù)提供者I發(fā)生了故障,當(dāng)前的應(yīng)用的部分業(yè)務(wù)因為依賴于服務(wù)I,因此也會被阻塞。此時,其它不依賴于服務(wù)I的業(yè)務(wù)似乎不受影響。
圖片
但是,依賴服務(wù)I的業(yè)務(wù)請求被阻塞,用戶不會得到響應(yīng),服務(wù)器的這個線程不會釋放,于是越來越多的用戶請求到來,越來越多的線程會阻塞:
圖片
服務(wù)器支持的線程和并發(fā)數(shù)有限,請求一直阻塞,會導(dǎo)致服務(wù)器資源耗盡,從而導(dǎo)致所有其它服務(wù)都不可用,那么當(dāng)前服務(wù)也就不可用了。
那么,依賴于當(dāng)前服務(wù)的其它服務(wù)隨著時間的推移,最終也都會變的不可用,形成級聯(lián)失敗,雪崩就發(fā)生了:
圖片
總結(jié)雪崩產(chǎn)生原因
- 依賴關(guān)系復(fù)雜性: 在微服務(wù)架構(gòu)中,各個服務(wù)之間存在復(fù)雜的依賴關(guān)系。如果一個服務(wù)出現(xiàn)故障,它可能會導(dǎo)致依賴于它的其他服務(wù)也無法正常工作。
- 大規(guī)模部署: 大規(guī)模部署意味著有大量的服務(wù)實例在運行,當(dāng)其中一部分實例出現(xiàn)問題時,整個系統(tǒng)可能受到影響。
- 同時故障: 有時,多個服務(wù)可能因相同的原因(如硬件故障、網(wǎng)絡(luò)問題或配置錯誤)而同時故障,導(dǎo)致雪崩效應(yīng)。
- 超時和重試: 如果某個服務(wù)在請求時長時間未響應(yīng),其他服務(wù)可能會發(fā)起重試請求,導(dǎo)致更多的負(fù)載,最終導(dǎo)致系統(tǒng)崩潰。
- 資源耗盡: 當(dāng)某個服務(wù)的資源(如數(shù)據(jù)庫連接、線程池)被過度消耗時,它可能會無法響應(yīng)請求,從而引發(fā)雪崩。
2. 雪崩解決方案
雪崩解決常見解決方案有以下幾種:
- 超時處理:對于每個微服務(wù)的請求,應(yīng)該設(shè)置合理的超時時間。超時時間應(yīng)該充分考慮服務(wù)的響應(yīng)時間和業(yè)務(wù)需求,以避免等待時間過長導(dǎo)致的問題
- 艙壁模式(Bulkhead Pattern for Avalanche):系統(tǒng)遇到雪崩風(fēng)險時,通過隔離不同服務(wù)或組件,以防止一個故障或高負(fù)載情況影響整個系統(tǒng)的穩(wěn)定性。是一種應(yīng)對潛在雪崩的設(shè)計模式
- 限流(Rate Limiting): 限流可以控制對服務(wù)的請求速率,確保不會超出服務(wù)的處理能力。這可以防止流量過多而導(dǎo)致系統(tǒng)崩潰
- 熔斷器模式(Circuit Breaker Pattern):熔斷器模式是一種容錯模式,用于避免雪崩效應(yīng)。熔斷器會監(jiān)控服務(wù)的健康狀態(tài),當(dāng)服務(wù)連續(xù)出現(xiàn)故障或響應(yīng)時間超過閾值時,熔斷器會打開,阻止進(jìn)一步的請求流量流向該服務(wù),從而保護(hù)系統(tǒng)的穩(wěn)定性
- 降級策略(Fallback): 降級是一種處理服務(wù)不可用或性能下降的策略,它允許系統(tǒng)在出現(xiàn)問題時提供有限但穩(wěn)定的功能,而不是完全失敗。當(dāng)服務(wù)出現(xiàn)問題時,降級策略可以返回默認(rèn)值、緩存數(shù)據(jù)、執(zhí)行備用操作或者提供一個基本的響應(yīng),以確保用戶仍然能夠訪問系統(tǒng)的一部分功能
2.1. 超時處理
針對服務(wù)調(diào)用增加超時機(jī)制(一般dubbo默認(rèn)30s),一旦超時自動釋放資源,因釋放資源較快一定程度可抑制資源耗盡問題。但如果在超時釋放的時間內(nèi)陡增大量請求,依然會導(dǎo)致服務(wù)宕機(jī)不可用。
圖片
2.2. 艙壁模式(Bulkhead Pattern for Avalanche)
倉壁模式來源于船艙的設(shè)計:船艙都會被隔板分離為多個獨立空間,當(dāng)船體破損時,只會導(dǎo)致部分空間進(jìn)入,將故障控制在一定范圍內(nèi),避免整個船體都被淹沒。于此類似,我們可以限定每個業(yè)務(wù)能使用的線程數(shù),避免耗盡整個服務(wù)器的資源,因此也叫線程隔離。
圖片
2.3. 熔斷器模式(Circuit Breaker Pattern)
熔斷器模式:由熔斷器統(tǒng)計業(yè)務(wù)執(zhí)行的異常比例,如果超出閾值則會熔斷該業(yè)務(wù),攔截訪問該業(yè)務(wù)的一切請求。
熔斷器會統(tǒng)計訪問某個服務(wù)的請求數(shù)量,異常比例
圖片
當(dāng)發(fā)現(xiàn)訪問服務(wù)D的請求異常比例過高時,認(rèn)為服務(wù)D有導(dǎo)致雪崩的風(fēng)險,會攔截訪問服務(wù)D的一切請求,形成熔斷:
圖片
2.4. 限流
限流:限制業(yè)務(wù)訪問的QPS,避免服務(wù)因流量的突增而故障。
圖片
3.總結(jié)
雪崩問題:
- 微服務(wù)之間相互調(diào)用,因為調(diào)用鏈中的一個服務(wù)故障,引起整個鏈路都無法訪問的情況。
解決方案:
限流是對服務(wù)的保護(hù),避免因瞬間高并發(fā)流量而導(dǎo)致服務(wù)故障,進(jìn)而避免雪崩。是一種預(yù)防措施。
超時處理、線程隔離、降級熔斷是在部分服務(wù)故障時,將故障控制在一定范圍,避免雪崩。是一種補(bǔ)救措施。