架構之服務降級

原文連接:http://www.javashuo.com/article/p-siwtlgyo-hp.htmlhtml

降級是系統保護的重要手段,保證系統的高可用,簡單理解,降級就是丟車保帥,在系統壓力極大時,暫時不作非必要動做,以保證系統核心功能的正常。數據庫

例如電商系統中,購物車、結算這類的核心功能就是保護對象,是絕對不能降級的,而像個性化自動商品推薦服務就能夠暫時不提供。緩存

降級策略有不少種,能夠從下面3個維度分爲5種策略:異步

  1. 自動化維度

包括:自動開關降級、人工開關降級。分佈式

  1. 功能維度

包括:讀服務降級、寫服務降級。性能

  1. 系統層次維度

包括:多級降級。測試

 

 1. 自動開關降級線程

系統在運行時根據運行狀態自動觸發降級,例如:設計

  • 超時

調用遠程非核心服務時,響應過慢後自動降級,先不調了。htm

須要配置好超時時間和超時重試次數。

  • 統計失敗次數

有的服務可能不太穩定,例如外部的機票服務,當調用失敗次數超過容忍度後就自動降級。能夠經過異步線程去探測服務是否恢復了,可用後自動取消降級。

  • 故障

好比遠程服務掛掉了,就自動降級,可使用默認值、提早準備的內容、以前的緩存數據。

  • 限流

例如秒殺系統,一般會使用限流機制進行保護,當達到限流閾值時,後續請求就自動被降級,例如將用戶導流到排隊頁面過會兒重試、直接告訴用戶沒貨了。

2. 手動開關降級

自動降級是根據系統出現的一些問題進行響應,但在系統尚未出現問題時,我就想降級某些服務,好比促銷立刻開始了,能夠預知訪問量很大,咱們提早就把推薦服務關掉;再好比新功能想上線進行灰度測試,當新功能不符合預期時我想立刻切換回老服務。

這類需求就須要使用能夠人工控制的開關來實現。

開關能夠存放到配置文件、數據庫、Redis/Zookeeper等位置,按期同步開關數據。

分佈式系統中一般會建立一個配置中心,對整個系統中的配置開關進行集中管理,提供 Web UI 界面進行便捷操做。目前有一些開源方案能夠選擇,例如 ZooKeeper、Diamond、Etcd 三、Consul。

3. 讀服務降級

讀取數據 的角度考慮降級,例如商品詳情頁,其中有很是多的內容,好比商家信息、推薦信息、配送至信息、相關分類、熱銷榜等等,這些都不是核心數據,因此在出現異常時能夠進行降級處理。

還以商品詳情頁爲例,在促銷活動以前,能夠將整個頁面切換爲靜態化,最大程度的降級讀服務。

4. 寫服務降級

寫服務都是很關鍵的,降級思路基本就是同步寫轉異步寫。

例如扣減庫存的操做,正常狀況下的設計通常是:

方案1:數據庫中扣減,成功後更新 Redis 緩存。

方案2:先扣減 Redis 緩存,同步扣減數據庫,若是失敗則回滾 Redis 緩存。

當數據庫性能跟不上時,就須要採用異步方式了:

先扣減 Redis 緩存,同時向隊列中發送一條扣減數據庫庫存的消息,異步進行數據庫扣減,實現最終一致性。

再好比用戶評價,若是量太大,就能夠把評價從同步寫轉爲異步寫,還有評價後會給一些獎勵,也能夠異步。

5. 多級降級

從距離用戶遠近的角度,能夠分爲如下3個層面:

  1. 頁面JS降級開關

主要控制頁面功能的降級,在頁面中經過JS腳本部署來控制在適當時機開啓/關閉開關。

  1. 接入層降級開關

在請求入口進行控制,請求進入後,會首先進入接入層,例如 Nginx,在其中根據實際狀況進行自動/人工降級。

接入層的控制功能是很強大的,能夠實現秒級切換、增量式切換(按照機器組開啓)、細粒度服務開關、超時自動降級。

  1. 應用層降級開關

在應用中配置相應的功能開關,根據實際狀況進行自動/人工降級。

相關文章
相關標籤/搜索