億級流量架構之服務降級思路與方法

什麼是服務降級

若是看過我前面對服務限流的分析,理解服務降級就很容易了,對於一個景區,平時隨便進出,可是一到春節或者十一國慶這種狀況客流量激增,那麼景區會限制同時進去的人數,這叫限流,那麼什麼是服務降級呢?html

簡單來講就是,將一些不過重要的景區項目砍掉,平時就那麼三五八我的,景區能夠開放湖中游泳啦,摸魚啦,捉蝦啦,有狀況工做人員能夠下湖撈你,可是如今客流量大了,工做人員關注不過來,都在湖裏晃盪萬一沉了不太安全,大手一揮,這個項目砍了,將工做人員分配在其餘地方。前端

在互聯網中也有相似的降級措施,像以前雙11, 有段時間是隻容許下單不容許退單或者改單,這樣作目的是什麼呢?web

仍是爲了保證服務的可用性,當硬件軟件優化到必定的程度仍是有上限,這時候將資源重點傾斜給核心業務,那些不過重要的就砍掉,保證服務的可用性。redis

服務等級定義

服務等級定義 SLA(Service Level Agreement)是斷定壓測是否異常的重要依據。壓測過程當中,經過監控核心服務狀態的 SLA 指標數據,能夠更直觀地瞭解壓測業務的狀態。數據庫

SLA則是服務商與您達成的正常運行時間保證。後端

關於這個的詳細解釋,能夠參考阿里雲的介紹:服務等級定義SLA,這兒不過多描述,SLA 分爲網絡服務和雲服務,提供商的在線保證率一般要求達到6個9。api

6個9含義

6個9指99.9999%,也就是一個服務有99.9999%機率是安全的,6個9有多安全呢?緩存

2個9 = (1-99%)X24 X 365 = 87.6 小時 = 3.65天安全

3個9 = (1-99.9%)X24 X 365 = 8.76 小時服務器

4個9 = (1-99.99%)X24 X 365 = 0.876 小時 = 52.56分鐘

5個9 = (1-99.999%)X24 X 365 = 0.0876 小時 = 5.256分鐘

6個9 = (1-99.9999%)X24 X 365 = 0.00876 小時 = 0.5256分鐘 = 31秒

也就是,一年當中,6個9的安全性最多會有31s服務是不可用,相對來講是極高的。

降級處理

兜底數據

這方面有不少例子,好比某些頁面掛了會返回尋親子網。能夠對一些關鍵數據設置一些兜底數據,例如設置默認值、靜態值、設置緩存等。

默認值: 設置安全的默認值,不會引發數據問題的值,好比庫存爲0

靜態值:請求的頁面或api沒法返回數據,提供一套靜態數據展現,好比加載失敗提示重試,或者尋親子網,或者跳到默認菜單,給用戶一個稍微好一點的體驗。

緩存: 緩存沒法更新便使用舊的緩存

限流降級

限流顧名思義,提早對各個類型的請求設置最高的QPS閾值,若高於設置的閾值則對該請求直接返回,再也不調用後續資源,也就是當流量洪峯到達的時候,可能須要丟棄一部分用戶來保證服務可用性,對於丟棄的用戶能夠提供友好的提示,好比提示用戶當前繁忙、稍後重試等。

限流須要結合壓測等,瞭解系統的最高水位,也是在實際開發中應用最多的一種穩定性保障手段。當服務器壓力劇增的狀況下,根據當前業務狀況及流量對一些服務和頁面有策略的降級,以此釋放服務器資源以保證核心任務的正常運行。

超時降級

對調用的數據設置超時時間,當調用失敗時,對服務降級,舉個例子,當訪問數據已經超時了,且這個業務不是核心業務,能夠在超時以後進行降級,好比商品詳情頁上有推薦內容或者評價,可是能夠降級顯示評價暫時不顯示,這對主要的用戶功能——購物,不產生影響,若是是遠程調用,則能夠商量一個雙方均可以接受的最大響應時間,超時則自動降級。

故障降級

若是遠程調用的服務器掛了(網絡故障、DNS故障、HTTP服務返回錯誤),則能夠進行降級, 例如返回默認值或者兜底數據或者靜態頁面,也能夠返回以前的緩存數據。

重試/自動處理

客戶端高可用:提供多個可調用的服務地址,這樣作

微服務重試:dubbo重試機制

API調用重試:當達到重試次數後,增長訪問標記,服務降級,異步探測服務是否恢復。

WEB端:在服務不可用時,web端增長重試按鈕或自動重試能夠提供更友好的體驗。

自動重試需設置重試次數和數據冪等處理

降級開關

在服務器提供支持期間, 若是監控到線上一些服務存在問題,這個時候須要暫時將這些服務去掉,有時候經過服務調用一些服務,可是服務依賴的數據庫可能存在,網卡被打滿了,數據庫掛了,不少慢查詢等等,此時要作的就是暫停相關的系統服務,也就是人工使用開關降級。開關能夠放在某地,按期同步開關數據,經過判斷開關值來決定是否作出降級。

開關降級還有一個做用,例如新的服務版本剛開發處在灰度測試階段,不太肯定裏面的邏輯等等是否正確,若是有問題應該能夠根據開關的值切回舊的版本。

在服務調用方設置一個flag,標記服務是否可用,另外key能夠存儲存儲在在本地,也能夠存儲在第三方的配置文件中,例如數據庫、redis、zookeeper中。

爬蟲和機器人

分析機器人行爲:短期連續操做,agent,行爲軌跡、拖拽(模擬登錄/秒殺/灌水)

爬蟲:引到到靜態頁或緩存頁

讀降級

簡而言之,在一個請求內,多級緩存架構下,後端緩存或db不可用,可使用前端緩存或兜底數據讓用戶體驗好一點。

對於讀服務降級通常採用的策略有:
暫時切換讀: 降級到讀緩存、降級到走靜態化
暫時屏蔽讀: 屏蔽讀入口、屏蔽某個讀服務

一般讀的流程爲: 接入層緩存→應用層本地緩存→分佈式緩存→RPC服務/DB

咱們會在接入層、應用層設置開關,當分佈式緩存、RPC服務/DB有問題時自動降級爲不調用。固然這種狀況適用於對讀一致性要求不高的場景。

頁面降級、頁面片斷降級、頁面異步請求降級都是讀服務降級,目的是丟卒保帥,保護核心線程,或者因數據問題暫時屏蔽。

還有一種是頁面靜態化場景。
動態化降級爲靜態化:好比,平時網站能夠走動態化渲染商品詳情頁,可是,到了大促來臨之際能夠將其切換爲靜態化來減小對核心資源的佔用,並且能夠提高性能。其餘還有如列表頁、首頁、頻道頁均可以這麼處理。能夠經過一個程序按期推送靜態頁到緩存或者生成到磁盤,出問題時直接切過去。
靜態化降級爲動態化:好比,當使用靜態化來實現商品詳情頁架構時,平時使用靜態化來提供服務,可是,由於特殊緣由靜態化頁面有問題了,須要暫時切換回動態化來保證服務正確性。 以上都保證了出問題時有預案,用戶能夠繼續使用網站,不影響用戶購物體驗。

寫降級

你們都知道硬盤性能比不上內存性能,若是訪問量很高的話,數據庫頻繁讀寫可能撐不住,那麼怎麼辦呢,可讓內存(假如是Redis)庫來暫時知足寫任務,同時將執行的指令記錄下來,而後將這個信息發送到數據庫,也就是不在追求內存與數據庫數據的強一致性,只要數據庫數據與Redis數據庫中的信息知足最終話一致性便可。

也就是說,正常狀況下能夠同步扣減庫存,在性能扛不住時,降級爲異步。另外,若是是秒殺場景能夠直接降級爲異步,從而保護系統。還有,以下單操做能夠在大促時暫時降級,將下單數據寫入Redis,而後等峯值過去了再同步回DB,固然也有更好的解決方案,可是更復雜,不是本篇的重點。

還有如用戶評價,若是評價量太大,那麼也能夠把評價從同步寫降級爲異步寫。固然也能夠對評價按鈕進行按比例開放(好比,一些人看不到評價操做按鈕)。好比,評價成功後會發一些獎勵,在必要的時候降級同步到異步。

總結
在cap原理和BASE理論中寫操做存在於數據一致性這個環節,降級的目的是爲了提供高可用性,在多數的互聯網架構中,可用性是大於數據一致性的。因此喪失寫入數據同步,經過上面的理論,咱們也能勉強接受數據最終一致性。高併發場景下,寫入操做沒法及時到達或抗壓,能夠異步消費數據/cache更新/log等方式

前端降級

當系統出現問題的時候,儘可能將請求隔離在離用戶最近的位置,避免無效鏈路訪問, 在後端服務部分或徹底不可用的時候,可使用本地緩存或兜底數據,在一些特殊場景下,對數據一致性要求不高的時候,好比秒殺、抽獎等能夠作假數據。

JS降級

在js中埋降級開關,在訪問不到達,系統閾值的時候能夠避免發送請求

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

接入層降級

能夠在接入層,在用戶請求還沒到達服務的時候,經過、Nginx + Lua、Haproxy + lua過濾無效請求達到服務降級的目的, 主要控制請求入口的降級,請求進入後,會首先進入接入層,在接入層能夠配置功能降級開關,能夠根據實際狀況進行自動/人工降級。這個能夠參考第17章,尤爲在後端應用服務出問題時,經過接入層降級從而給應用服務有足夠的時間恢復服務。

應用層降級

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

SpringCloud中能夠經過Hystrix配置中心能夠進行人工降級,也能夠根據服務的超時時間進行自動降級, Hystrix是Netflix開源的一款針對分佈式系統的延遲和容錯庫,目的是用來隔離分佈式服務故障。它提供線程和信號量隔離,以減小不一樣服務之間資源競爭帶來的相互影響;官網講Hystrix提供優雅降級機制;提供熔斷機制使得服務能夠快速失敗,而不是一直阻塞等待服務響應,並能從中快速恢復。Hystrix經過這些機制來阻止級聯失敗並保證系統彈性、可用。下圖是一個典型的分佈式服務實現。

片斷降級

例如打開淘寶首頁,這一瞬間須要加載不少數據,有靜態的例如圖片、CSS、JS等,也有不少其餘商品等等,這麼多數據中,若是一部分沒有請求到,那麼就能夠片斷降級,意思是就不加載這些數據了,用其餘數據頂替,例如其餘商品信息或者等等。

提早預埋

這個很容易理解,你們應該都記得,每次雙十一以前,淘寶總會提醒你下載更新,按道理來說,活動還沒開始,更新啥呢?

作法是對於一部分靜態數據能夠提早更新到你手機上,當你雙十一時就不用再遠程鏈接服務器加載了,避免了消耗網絡資源。

相關文章
相關標籤/搜索