微服務(wù)流控防護(hù)場景與應(yīng)對措施
前言
微服務(wù)成了互聯(lián)網(wǎng)架構(gòu)的標(biāo)配模式,對微服務(wù)之間的調(diào)用的流量治理和管控就尤為重要。哪些場景需要流量防控,針對這些場景又有哪些應(yīng)對措施。有沒有一個通用的措施來降低風(fēng)險呢?這篇文章咱就聊聊這個。
一、服務(wù)被過載調(diào)用
當(dāng)服務(wù)D的某個接口服務(wù)被上游服務(wù)過載調(diào)用時,如果不對服務(wù)D加入保護(hù),可能整體將服務(wù)D整體拖垮。在這種場景中,我們需要對服務(wù)D配置限流,以保護(hù)服務(wù)D不被整體沖跨。
應(yīng)對措施: 針對服務(wù)提供方D配置流量防護(hù)規(guī)則,對進(jìn)入服務(wù)D的流量進(jìn)行控制,從而對服務(wù)D提供保護(hù)。觸發(fā)流控時可以有多重策略,例如:快速失敗、預(yù)熱模式、排隊等待、預(yù)熱模式+排隊等待。
快速失敗: 發(fā)生流控時直接拋出異常。
預(yù)熱模式: 發(fā)生流控時,流量緩慢增加的一種模式,效果如下圖所示,流量QPS從200緩慢增加到600。
排隊等待: 請求勻速通過,過多請求需要排隊,此時排隊有超時時間,超過排隊時間拋出流控異常。效果如下圖所示:請求QPS保持1000的勻速通過。
預(yù)熱模式+排隊等待: 這種模式是預(yù)熱和排隊等待的疊加模式,請求以勻速的方式緩慢增加。如下圖:請求從0緩慢增加到500,勻速通過一段時間后,再增加到1000。
二、服務(wù)慢調(diào)用或故障
下面的場景A調(diào)用B、A調(diào)用C、A調(diào)用D,當(dāng)服務(wù)B服務(wù)不穩(wěn)定時,服務(wù)A調(diào)用服務(wù)B發(fā)生了慢調(diào)用或者大量異常錯誤。這種場景,如果不干預(yù),可能影響到A調(diào)用C和A調(diào)用D的狀況。
應(yīng)對措施: A調(diào)用B配置熔斷降級規(guī)則,當(dāng)服務(wù)B不穩(wěn)定發(fā)生慢調(diào)用或者異常時,如果觸發(fā)閾值,將服務(wù)B的調(diào)用熔斷;從而保護(hù)了服務(wù)A調(diào)用C、服務(wù)A調(diào)用D的正常情況。
熔斷效果: 熔斷的實現(xiàn)通常通過斷路器實現(xiàn),具體過程為:
- 當(dāng)滿足慢調(diào)用比例、異常比例、異常數(shù)量閾值后,觸發(fā)熔斷(OPEN),在熔斷時長內(nèi)拒絕所有請求
- 當(dāng)熔斷過了定義的熔斷時長,狀態(tài)由熔斷(OPEN)變?yōu)樘綔y(HALF_OPEN)
- 接下來的一個請求不發(fā)生慢調(diào)用或者異常,熔斷結(jié)束由探測狀態(tài)(HALF_OPEN)變?yōu)椋–LOSED)
- 接下來的一個請求發(fā)生慢調(diào)用或者異常,繼續(xù)熔斷,由探測狀態(tài)(HALF_OPEN)變?yōu)椋∣PEN)
三、服務(wù)資源被擠占
分布式鏈路中,如果某一條鏈路產(chǎn)生慢調(diào)用,對其他鏈路造成擠壓。除了上面提到配置熔斷降級外,可以通過線程并發(fā)控制來隔離。
下圖中有3條鏈路,其中鏈路1由于服務(wù)E的不穩(wěn)定,產(chǎn)生了慢調(diào)用。
鏈路1慢調(diào)用可能導(dǎo)致如下情況:
- 鏈路1線程數(shù)增多對服務(wù)D資源造成擠壓
- 對服務(wù)D資源的過度擠壓,鏈路2和鏈路3造成不穩(wěn)定
- 極端情況導(dǎo)致整個服務(wù)D不可用,嚴(yán)重時引發(fā)雪崩
應(yīng)對措施: 通過對服務(wù)D的MethodA1、MethodA2的線程數(shù)并發(fā)設(shè)置規(guī)則,超過閾值時將會觸發(fā)阻斷,不再向下游調(diào)用,避免不可用引發(fā)雪崩。
并發(fā)控制效果 下圖中設(shè)置了調(diào)用方的并發(fā)線程數(shù)為10,通過每分鐘的查詢可以看出,線程數(shù)一直保持在10。
四、數(shù)據(jù)過熱擠占資源
熱點數(shù)據(jù),比如:大促時的熱銷產(chǎn)品、秒殺類產(chǎn)品等。如下圖所示,如果不對熱點商品下單流量進(jìn)行管控,可能對其他商品造成擠壓;影響整個商品下單體驗。
應(yīng)對措施: 通過對熱點參數(shù)測速,配置流控規(guī)則,超過閾值時觸發(fā)流控。例如:通過對入?yún)a(chǎn)品ID進(jìn)行測速,超過設(shè)置的閾值時,觸發(fā)流控,避免對其過度擠占資源。
五、通用防護(hù)分組措施
上面的現(xiàn)象中,無論是服務(wù)不穩(wěn)定、還是被擠占、或者被過載調(diào)用。除了通過上述的防護(hù)措施外,可以對服務(wù)進(jìn)行等級劃分并分組。
如下圖所示:服務(wù)A和服務(wù)D為核心服務(wù)、服務(wù)B和服務(wù)C為非核心服務(wù)。通過將服務(wù)D進(jìn)行分組,分成了1組和2組。分組1只允許核心服務(wù)調(diào)用,分組2只允許非核心服務(wù)調(diào)用。
這樣做的好處:將流量進(jìn)行物理隔離,避免由于非核心業(yè)務(wù)流量對核心業(yè)務(wù)流量造成擠壓、保護(hù)核心鏈路穩(wěn)定性。
分組措施@1 通常可以更換注冊中心路徑實現(xiàn),服務(wù)A和服務(wù)D(分組1)放在同一個注冊中心路徑(例如:soa-group1);服務(wù)B、服務(wù)C、服務(wù)D(分組2)放在另一個不同的注冊中心路徑(例如:soa-group2)。
分組措施@2 通過對分組的服務(wù)節(jié)點打標(biāo)實現(xiàn),例如:服務(wù)D(分組1)節(jié)點被打標(biāo)為group1,服務(wù)D(分組2)節(jié)點被打標(biāo)為group2。在服務(wù)消費方訂閱節(jié)點時根據(jù)不同的分組篩選節(jié)點調(diào)用。