億級流量架構(gòu)服務(wù)降級,寫得太好了!
作者:等不到的口琴
來源:www.cnblogs.com/Courage129/p/14427020.html
什么是服務(wù)降級
如果看過我前面對服務(wù)限流的分析,理解服務(wù)降級就很容易了,對于一個景區(qū),平時隨便進(jìn)出,但是一到春節(jié)或者十一國慶這種情況客流量激增,那么景區(qū)會限制同時進(jìn)去的人數(shù),這叫限流,那么什么是服務(wù)降級呢?
在互聯(lián)網(wǎng)中也有類似的降級措施,像之前雙11, 有段時間是只允許下單不允許退單或者改單,這樣做目的是什么呢?
還是為了保證服務(wù)的可用性,當(dāng)硬件軟件優(yōu)化到一定的程度還是有上限,這時候?qū)①Y源重點傾斜給核心業(yè)務(wù),那些不太重要的就砍掉,保證服務(wù)的可用性。
服務(wù)等級定義
服務(wù)等級定義 SLA(Service Level Agreement)是判定壓測是否異常的重要依據(jù)。壓測過程中,通過監(jiān)控核心服務(wù)狀態(tài)的 SLA 指標(biāo)數(shù)據(jù),可以更直觀地了解壓測業(yè)務(wù)的狀態(tài)。
SLA則是服務(wù)商與您達(dá)成的正常運行時間保證。
關(guān)于這個的詳細(xì)解釋,可以參考阿里云的介紹:服務(wù)等級定義SLA(https://help.aliyun.com/document_detail/111729.html),這兒不過多描述,SLA 分為網(wǎng)絡(luò)服務(wù)和云服務(wù),提供商的在線保證率通常要求達(dá)到6個9。
6個9含義
6個9指99.9999%,也就是一個服務(wù)有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秒
也就是,一年當(dāng)中,6個9的安全性最多會有31s服務(wù)是不可用,相對來說是極高的。
降級處理
兜底數(shù)據(jù)
默認(rèn)值: 設(shè)置安全的默認(rèn)值,不會引起數(shù)據(jù)問題的值,比如庫存為0
靜態(tài)值:請求的頁面或api無法返回數(shù)據(jù),提供一套靜態(tài)數(shù)據(jù)展示,比如加載失敗提示重試,或者尋親子網(wǎng),或者跳到默認(rèn)菜單,給用戶一個稍微好一點的體驗。
緩存: 緩存無法更新便使用舊的緩存
限流降級
限流顧名思義,提前對各個類型的請求設(shè)置最高的QPS閾值,若高于設(shè)置的閾值則對該請求直接返回,不再調(diào)用后續(xù)資源,也就是當(dāng)流量洪峰到達(dá)的時候,可能需要丟棄一部分用戶來保證服務(wù)可用性,對于丟棄的用戶可以提供友好的提示,比如提示用戶當(dāng)前繁忙、稍后重試等。
超時降級
對調(diào)用的數(shù)據(jù)設(shè)置超時時間,當(dāng)調(diào)用失敗時,對服務(wù)降級,舉個例子,當(dāng)訪問數(shù)據(jù)已經(jīng)超時了,且這個業(yè)務(wù)不是核心業(yè)務(wù),可以在超時之后進(jìn)行降級,比如商品詳情頁上有推薦內(nèi)容或者評價,但是可以降級顯示評價暫時不顯示,這對主要的用戶功能——購物,不產(chǎn)生影響,如果是遠(yuǎn)程調(diào)用,則可以商量一個雙方都可以接受的最大響應(yīng)時間,超時則自動降級。
故障降級
如果遠(yuǎn)程調(diào)用的服務(wù)器掛了(網(wǎng)絡(luò)故障、DNS故障、HTTP服務(wù)返回錯誤),則可以進(jìn)行降級, 例如返回默認(rèn)值或者兜底數(shù)據(jù)或者靜態(tài)頁面,也可以返回之前的緩存數(shù)據(jù)。
重試/自動處理
客戶端高可用:提供多個可調(diào)用的服務(wù)地址,這樣做
微服務(wù)重試:dubbo重試機制
API調(diào)用重試:當(dāng)達(dá)到重試次數(shù)后,增加訪問標(biāo)記,服務(wù)降級,異步探測服務(wù)是否恢復(fù)。
WEB端:在服務(wù)不可用時,web端增加重試按鈕或自動重試可以提供更友好的體驗。
自動重試需設(shè)置重試次數(shù)和數(shù)據(jù)冪等處理
降級開關(guān)
在服務(wù)器提供支持期間, 如果監(jiān)控到線上一些服務(wù)存在問題,這個時候需要暫時將這些服務(wù)去掉,有時候通過服務(wù)調(diào)用一些服務(wù),但是服務(wù)依賴的數(shù)據(jù)庫可能存在,網(wǎng)卡被打滿了,數(shù)據(jù)庫掛了,很多慢查詢等等,此時要做的就是暫停相關(guān)的系統(tǒng)服務(wù),也就是人工使用開關(guān)降級。開關(guān)可以放在某地,定期同步開關(guān)數(shù)據(jù),通過判斷開關(guān)值來決定是否做出降級。
開關(guān)降級還有一個作用,例如新的服務(wù)版本剛開發(fā)處在灰度測試階段,不太確定里面的邏輯等等是否正確,如果有問題應(yīng)該可以根據(jù)開關(guān)的值切回舊的版本。
在服務(wù)調(diào)用方設(shè)置一個flag,標(biāo)記服務(wù)是否可用,另外key可以存儲存儲在在本地,也可以存儲在第三方的配置文件中,例如數(shù)據(jù)庫、redis、zookeeper中。
爬蟲和機器人
分析機器人行為:短時間連續(xù)操作,agent,行為軌跡、拖拽(模擬登陸/秒殺/灌水)
讀降級
簡而言之,在一個請求內(nèi),多級緩存架構(gòu)下,后端緩存或db不可用,可以使用前端緩存或兜底數(shù)據(jù)讓用戶體驗好一點。
對于讀服務(wù)降級一般采用的策略有:暫時切換讀: 降級到讀緩存、降級到走靜態(tài)化暫時屏蔽讀: 屏蔽讀入口、屏蔽某個讀服務(wù)
通常讀的流程為: 接入層緩存→應(yīng)用層本地緩存→分布式緩存→RPC服務(wù)/DB
我們會在接入層、應(yīng)用層設(shè)置開關(guān),當(dāng)分布式緩存、RPC服務(wù)/DB有問題時自動降級為不調(diào)用。當(dāng)然這種情況適用于對讀一致性要求不高的場景。
頁面降級、頁面片段降級、頁面異步請求降級都是讀服務(wù)降級,目的是丟卒保帥,保護(hù)核心線程,或者因數(shù)據(jù)問題暫時屏蔽。
還有一種是頁面靜態(tài)化場景。
動態(tài)化降級為靜態(tài)化:比如,平時網(wǎng)站可以走動態(tài)化渲染商品詳情頁,但是,到了大促來臨之際可以將其切換為靜態(tài)化來減少對核心資源的占用,而且可以提升性能。其他還有如列表頁、首頁、頻道頁都可以這么處理。可以通過一個程序定期推送靜態(tài)頁到緩存或者生成到磁盤,出問題時直接切過去。
靜態(tài)化降級為動態(tài)化:比如,當(dāng)使用靜態(tài)化來實現(xiàn)商品詳情頁架構(gòu)時,平時使用靜態(tài)化來提供服務(wù),但是,因為特殊原因靜態(tài)化頁面有問題了,需要暫時切換回動態(tài)化來保證服務(wù)正確性。以上都保證了出問題時有預(yù)案,用戶可以繼續(xù)使用網(wǎng)站,不影響用戶購物體驗。
寫降級
大家都知道硬盤性能比不上內(nèi)存性能,如果訪問量很高的話,數(shù)據(jù)庫頻繁讀寫可能撐不住,那么怎么辦呢,可以讓內(nèi)存(假如是Redis)庫來暫時滿足寫任務(wù),同時將執(zhí)行的指令記錄下來,然后將這個信息發(fā)送到數(shù)據(jù)庫,也就是不在追求內(nèi)存與數(shù)據(jù)庫數(shù)據(jù)的強一致性,只要數(shù)據(jù)庫數(shù)據(jù)與Redis數(shù)據(jù)庫中的信息滿足最終話一致性即可。
還有如用戶評價,如果評價量太大,那么也可以把評價從同步寫降級為異步寫。當(dāng)然也可以對評價按鈕進(jìn)行按比例開放(比如,一些人看不到評價操作按鈕)。比如,評價成功后會發(fā)一些獎勵,在必要的時候降級同步到異步。
總結(jié)在cap原理和BASE理論中寫操作存在于數(shù)據(jù)一致性這個環(huán)節(jié),降級的目的是為了提供高可用性,在多數(shù)的互聯(lián)網(wǎng)架構(gòu)中,可用性是大于數(shù)據(jù)一致性的。所以喪失寫入數(shù)據(jù)同步,通過上面的理論,我們也能勉強接受數(shù)據(jù)最終一致性。高并發(fā)場景下,寫入操作無法及時到達(dá)或抗壓,可以異步消費數(shù)據(jù)/cache更新/log等方式
前端降級
當(dāng)系統(tǒng)出現(xiàn)問題的時候,盡量將請求隔離在離用戶最近的位置,避免無效鏈路訪問, 在后端服務(wù)部分或完全不可用的時候,可以使用本地緩存或兜底數(shù)據(jù),在一些特殊場景下,對數(shù)據(jù)一致性要求不高的時候,比如秒殺、抽獎等可以做假數(shù)據(jù)。
另外,架構(gòu)設(shè)計系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以在線閱讀。
JS降級
在js中埋降級開關(guān),在訪問不到達(dá),系統(tǒng)閾值的時候可以避免發(fā)送請求
主要控制頁面功能的降級,在頁面中,通過JS腳本部署功能降級開關(guān),在適當(dāng)時機開啟/關(guān)閉開關(guān)。
接入層降級
應(yīng)用層降級
主要控制業(yè)務(wù)的降級,在應(yīng)用中配置相應(yīng)的功能開關(guān),根據(jù)實際業(yè)務(wù)情況進(jìn)行自動/人工降級。
SpringCloud中可以通過Hystrix配置中心可以進(jìn)行人工降級,也可以根據(jù)服務(wù)的超時時間進(jìn)行自動降級, Hystrix是Netflix開源的一款針對分布式系統(tǒng)的延遲和容錯庫,目的是用來隔離分布式服務(wù)故障。
它提供線程和信號量隔離,以減少不同服務(wù)之間資源競爭帶來的相互影響;官網(wǎng)講Hystrix提供優(yōu)雅降級機制;提供熔斷機制使得服務(wù)可以快速失敗,而不是一直阻塞等待服務(wù)響應(yīng),并能從中快速恢復(fù)。Hystrix通過這些機制來阻止級聯(lián)失敗并保證系統(tǒng)彈性、可用。下圖是一個典型的分布式服務(wù)實現(xiàn)。
片段降級
提前預(yù)埋
這個很容易理解,大家應(yīng)該都記得,每次雙十一之前,淘寶總會提醒你下載更新,按道理來講,活動還沒開始,更新啥呢?
感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
正文結(jié)束
1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵志故事
3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧
5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...
6.IntelliJ IDEA 2019.3 首個最新訪問版本發(fā)布,新特性搶先看

