微服務(wù)架構(gòu)下如何正確的選擇降級策略保障服務(wù)高可用?

摘要:在微服務(wù)架構(gòu)下,一個服務(wù)可能依賴多個下游服務(wù),為了保證自身服務(wù)的可用性,當(dāng)下游服務(wù)出現(xiàn)故障時,特別是強(qiáng)依賴的下游服務(wù)出現(xiàn)故障時,如何做才能最大程度的保證自己不受影或者說把影響降到最低?

關(guān)鍵詞:微服務(wù) 降級 高可用

一、依賴服務(wù)的分級

一個服務(wù)依賴的可能有很多個,但并不是每一個依賴都需要同等對待,我們可以將依賴服務(wù)對本身邏輯的影響范圍大致分為弱依賴和強(qiáng)依賴。

  • 弱依賴:不影響核心邏輯的依賴服務(wù),例如:直播APP列表中主播的角標(biāo)信息,即時沒有數(shù)據(jù)也不影響進(jìn)房。
  • 強(qiáng)依賴:影響核心邏輯的依賴服務(wù),例如:直播APP列表中主播的房間號,沒了就進(jìn)不了房。

注意,同一個服務(wù)在不同的場景下分級可能會不一樣,并且隨著業(yè)務(wù)的變化,強(qiáng)依賴和弱依賴間可能發(fā)生轉(zhuǎn)變。

二、降級的時機(jī)

根據(jù)降級的觸發(fā)條件可分為主動降級和被動降級;

  • 主動降級:一般在大型活動時產(chǎn)生流量尖峰,系統(tǒng)無法支撐,提前對非核心的業(yè)務(wù)進(jìn)行了降級處理;
  • 被動降級:一般是在發(fā)生故障時自動觸發(fā)預(yù)設(shè)的降級策略。

舉個例子,某個流量明星的演唱會獨(dú)家直播,可能帶來平時流量的10+倍以上,預(yù)估已經(jīng)達(dá)到了某些瓶頸,為了保證核心業(yè)務(wù)的可用性,就需要提前做好預(yù)案犧牲一些邊緣業(yè)務(wù)。

三、降級的策略

降級策略大致可以分為以下幾類,不同的策略適用的場景和依賴級別會有所不同,下面針對每一種降級策略進(jìn)行了分析,多種策略可以根據(jù)情況結(jié)合使用。

1、讀舊

每次服務(wù)調(diào)用成功時,記錄服務(wù)的結(jié)果,下一次失敗時讀取緩存的舊數(shù)據(jù);可以根據(jù)時延要求選擇本地緩存、分布式緩存、數(shù)據(jù)庫或本地文件。
適用場景:
弱依賴&強(qiáng)依賴,只讀業(yè)務(wù),能夠接受一定的延遲,有足夠的存儲資源。

需要注意:

  1. 分布式緩存或數(shù)據(jù)庫只是把服務(wù)故障轉(zhuǎn)移到另一個依賴,依賴故障多是網(wǎng)絡(luò)故障時謹(jǐn)慎選擇。
  2. 冷數(shù)據(jù)無法降級;
  3. 降級后的數(shù)據(jù)存在一致性問題;根據(jù)業(yè)務(wù)情況設(shè)置合理的有效期;
  4. 數(shù)據(jù)量大時消耗過多的存儲(特別是緩存)且命中率低,可以設(shè)置合理的緩存大小,使用LRU方式替換舊緩存。

舉例:
查詢用戶的守護(hù)主播服務(wù)故障時可以使用舊數(shù)據(jù),因?yàn)橛惺刈o(hù)的用戶占比?。ㄕ加镁彺嫘。?,且活躍度高(冷數(shù)據(jù)少)。

2、PlanB

提前準(zhǔn)備好候選方案,核心業(yè)務(wù)甚至可以有PlanC、PlanD等,按業(yè)務(wù)損害從小到大排序。
適用場景:
弱依賴&強(qiáng)依賴,只讀業(yè)務(wù),有備用數(shù)據(jù)。
需要注意:
根據(jù)業(yè)務(wù)評估影響范圍以及合理的備選方案。
舉例:
直播推薦頁的信息流依賴個性化推薦服務(wù)失敗時,降級使用熱門推薦;熱門推薦接口也故障時,使用備用接口,備用接口的邏輯盡可能簡化降低故障概率并采用較長的CDN緩存;備用接口依然失敗時繼續(xù)降級為使用客戶端緩存。

3、默認(rèn)值

直接返回配置中的默認(rèn)值或者空數(shù)據(jù)。

適用場景:
弱依賴,只讀業(yè)務(wù)。

需要注意:
默認(rèn)值盡量有多種選擇,避免千篇一律。

舉例:
主播標(biāo)語服務(wù),在配置中心配置一批中性的默認(rèn)標(biāo)語,標(biāo)語服務(wù)失敗時直接隨機(jī)取一條返回給用戶,故障率不高的情況下用戶基本上感知不到異常。

4、放棄部分請求

選擇性丟棄部分請求,也是一種限流措施。

適用場景:
弱依賴&強(qiáng)依賴,部分特殊場景。

需要注意:
需要盡量保障丟棄后的請求不會使用戶流程受阻,或?qū)е掠脩趔w驗(yàn)受損嚴(yán)重。

舉例:
在大型活動直播間的彈幕,當(dāng)大量彈幕刷屏?xí)r,使用一定采樣比率丟棄部分彈幕,用戶并不會太在意自己的彈幕是否飄過,是在太多了。

5、降低質(zhì)量

使用低資源消耗的服務(wù)替代高資源消耗的服務(wù)。

適用場景:
弱依賴&強(qiáng)依賴,部分特殊場景。

舉例:
直播視頻使用低碼率替代高碼率,使用標(biāo)清替代高清,也可以根據(jù)用戶的等級區(qū)別對待,比如VIP用戶推高清,普通用戶推標(biāo)清。

6、提高參與門檻

其實(shí)這算一個限流的措施,比如當(dāng)直播間人數(shù)已經(jīng)接近設(shè)定閥值時,限制只有VIP用戶才能繼續(xù)進(jìn)入。

7、反向過濾

過濾某個集合中的子集時,通過補(bǔ)集過濾,補(bǔ)集讀取失敗時放棄過濾;例如白名單改成黑名單(需要注意數(shù)據(jù)量),黑名單服務(wù)故障時則降級為通過;

適用場景:
弱依賴。

舉例:
查詢有線主播的城市列表,依賴服務(wù)提供無在線主播的城市(而不是有在線的城市),服務(wù)失敗時則可以采用全部城市都顯示的方式,比一個城市或極少城市顯示體驗(yàn)好。

8、補(bǔ)償

采用事后處理,可以是自動或者手動補(bǔ)償。

適用場景:
弱依賴&強(qiáng)依賴,對實(shí)時性有一定容忍度。

舉例:
Appstore充值服務(wù)在海外經(jīng)常導(dǎo)致校驗(yàn)憑證失敗,這時可以記錄日志采用后臺自動補(bǔ)單方式,并告知用戶稍后查詢,正常重試幾次后基本能夠完成到賬。

9、容災(zāi)

依賴服務(wù)需要使用同城雙機(jī)房、異地三機(jī)房、兩地三中心等災(zāi)備方案中的一種,調(diào)用方通過災(zāi)備自動切換方案進(jìn)行重試。

適用場景:
弱依賴&強(qiáng)依賴。

需要注意:
擴(kuò)機(jī)房重試可能產(chǎn)生較高的時延,根據(jù)業(yè)務(wù)情況設(shè)置合理的超時時間。

舉例:
關(guān)注服務(wù)是一個核心的業(yè)務(wù),部署了異地雙活,當(dāng)單機(jī)房故障時重試另一個機(jī)房通常都能夠成功。

四、總結(jié)

降級是一種保障高可用非常有效的手段,但同時對設(shè)計(jì)者的要求也較高;實(shí)際工作中需要對業(yè)務(wù)非常了解,能夠?qū)γ糠N降級方式給業(yè)務(wù)帶來影響精確的評估。另外對于依賴服務(wù),要有合理的超時和重試機(jī)制,預(yù)留好降級需要的時間和資源,比如依賴超時太長或重試次數(shù)太多,你的上游已經(jīng)中斷請求了,這時再好的降級也是徒勞的。

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

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

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