<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          架構(gòu)相關(guān):服務(wù)降級(jí)思路與方法

          共 4661字,需瀏覽 10分鐘

           ·

          2021-10-26 15:44


          點(diǎn)擊上方?藍(lán)字?關(guān)注我們!



          2021 最新 Java 編程資料免費(fèi)領(lǐng)!Java 視頻教程,Java Web 項(xiàng)目教程,互聯(lián)網(wǎng)Java 面試真題 / 算法題,簡(jiǎn)歷模板,Linux 服務(wù)器等等,點(diǎn)擊領(lǐng)取!

          正文如下

          來(lái)源:www.cnblogs.com/
          Courage129/p/14427020.html

          • 什么是服務(wù)降級(jí)
          • 服務(wù)等級(jí)定義
            • 6個(gè)9含義
          • 降級(jí)處理
            • 兜底數(shù)據(jù)
          • 限流降級(jí)
          • 超時(shí)降級(jí)
          • 故障降級(jí)
            • 重試/自動(dòng)處理
          • 降級(jí)開(kāi)關(guān)
            • 爬蟲(chóng)和機(jī)器人
            • 讀降級(jí)
            • 寫(xiě)降級(jí)
          • 前端降級(jí)
          • 片段降級(jí)
          • 提前預(yù)埋

          什么是服務(wù)降級(jí)

          如果看過(guò)我前面對(duì)服務(wù)限流的分析,理解服務(wù)降級(jí)就很容易了,對(duì)于一個(gè)景區(qū),平時(shí)隨便進(jìn)出,但是一到春節(jié)或者十一國(guó)慶這種情況客流量激增,那么景區(qū)會(huì)限制同時(shí)進(jìn)去的人數(shù),這叫限流,那么什么是服務(wù)降級(jí)呢?

          簡(jiǎn)單來(lái)說(shuō)就是,將一些不太重要的景區(qū)項(xiàng)目砍掉,平時(shí)就那么三五八個(gè)人,景區(qū)可以開(kāi)放湖中游泳啦,摸魚(yú)啦,捉蝦啦,有情況工作人員可以下湖撈你,但是現(xiàn)在客流量大了,工作人員關(guān)注不過(guò)來(lái),都在湖里晃蕩萬(wàn)一沉了不太安全,大手一揮,這個(gè)項(xiàng)目砍了,將工作人員分配在其他地方。

          在互聯(lián)網(wǎng)中也有類(lèi)似的降級(jí)措施,像之前雙11, 有段時(shí)間是只允許下單不允許退單或者改單,這樣做目的是什么呢?

          還是為了保證服務(wù)的可用性,當(dāng)硬件軟件優(yōu)化到一定的程度還是有上限,這時(shí)候?qū)①Y源重點(diǎn)傾斜給核心業(yè)務(wù),那些不太重要的就砍掉,保證服務(wù)的可用性。

          服務(wù)等級(jí)定義

          服務(wù)等級(jí)定義 SLA(Service Level Agreement)是判定壓測(cè)是否異常的重要依據(jù)。壓測(cè)過(guò)程中,通過(guò)監(jiān)控核心服務(wù)狀態(tài)的 SLA 指標(biāo)數(shù)據(jù),可以更直觀地了解壓測(cè)業(yè)務(wù)的狀態(tài)。

          SLA則是服務(wù)商與您達(dá)成的正常運(yùn)行時(shí)間保證。

          關(guān)于這個(gè)的詳細(xì)解釋,可以參考阿里云的介紹:服務(wù)等級(jí)定義SLA(https://help.aliyun.com/document_detail/111729.html),這兒不過(guò)多描述,SLA 分為網(wǎng)絡(luò)服務(wù)和云服務(wù),提供商的在線保證率通常要求達(dá)到6個(gè)9。

          6個(gè)9含義

          6個(gè)9指99.9999%,也就是一個(gè)服務(wù)有99.9999%概率是安全的,6個(gè)9有多安全呢?

          2個(gè)9 = (1-99%)X24 X 365 = 87.6 小時(shí) = 3.65天

          3個(gè)9 = (1-99.9%)X24 X 365 = 8.76 小時(shí)

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

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

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

          也就是,一年當(dāng)中,6個(gè)9的安全性最多會(huì)有31s服務(wù)是不可用,相對(duì)來(lái)說(shuō)是極高的。

          降級(jí)處理

          兜底數(shù)據(jù)

          這方面有很多例子,比如某些頁(yè)面掛了會(huì)返回尋親子網(wǎng)??梢詫?duì)一些關(guān)鍵數(shù)據(jù)設(shè)置一些兜底數(shù)據(jù),例如設(shè)置默認(rèn)值、靜態(tài)值、設(shè)置緩存等。

          默認(rèn)值 : 設(shè)置安全的默認(rèn)值,不會(huì)引起數(shù)據(jù)問(wèn)題的值,比如庫(kù)存為0

          靜態(tài)值 :請(qǐng)求的頁(yè)面或api無(wú)法返回?cái)?shù)據(jù),提供一套靜態(tài)數(shù)據(jù)展示,比如加載失敗提示重試,或者尋親子網(wǎng),或者跳到默認(rèn)菜單,給用戶一個(gè)稍微好一點(diǎn)的體驗(yàn)。

          緩存 : 緩存無(wú)法更新便使用舊的緩存

          限流降級(jí)

          限流顧名思義,提前對(duì)各個(gè)類(lèi)型的請(qǐng)求設(shè)置最高的QPS閾值,若高于設(shè)置的閾值則對(duì)該請(qǐng)求直接返回,不再調(diào)用后續(xù)資源,也就是當(dāng)流量洪峰到達(dá)的時(shí)候,可能需要丟棄一部分用戶來(lái)保證服務(wù)可用性,對(duì)于丟棄的用戶可以提供友好的提示,比如提示用戶當(dāng)前繁忙、稍后重試等。

          限流需要結(jié)合壓測(cè)等,了解系統(tǒng)的最高水位,也是在實(shí)際開(kāi)發(fā)中應(yīng)用最多的一種穩(wěn)定性保障手段。當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對(duì)一些服務(wù)和頁(yè)面有策略的降級(jí),以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行。

          超時(shí)降級(jí)

          對(duì)調(diào)用的數(shù)據(jù)設(shè)置超時(shí)時(shí)間,當(dāng)調(diào)用失敗時(shí),對(duì)服務(wù)降級(jí),舉個(gè)例子,當(dāng)訪問(wèn)數(shù)據(jù)已經(jīng)超時(shí)了,且這個(gè)業(yè)務(wù)不是核心業(yè)務(wù),可以在超時(shí)之后進(jìn)行降級(jí),比如商品詳情頁(yè)上有推薦內(nèi)容或者評(píng)價(jià),但是可以降級(jí)顯示評(píng)價(jià)暫時(shí)不顯示,這對(duì)主要的用戶功能——購(gòu)物,不產(chǎn)生影響,如果是遠(yuǎn)程調(diào)用,則可以商量一個(gè)雙方都可以接受的最大響應(yīng)時(shí)間,超時(shí)則自動(dòng)降級(jí)。

          故障降級(jí)

          如果遠(yuǎn)程調(diào)用的服務(wù)器掛了(網(wǎng)絡(luò)故障、DNS故障、HTTP服務(wù)返回錯(cuò)誤),則可以進(jìn)行降級(jí), 例如返回默認(rèn)值或者兜底數(shù)據(jù)或者靜態(tài)頁(yè)面,也可以返回之前的緩存數(shù)據(jù)。

          重試/自動(dòng)處理

          客戶端高可用:提供多個(gè)可調(diào)用的服務(wù)地址,這樣做

          微服務(wù)重試:dubbo重試機(jī)制

          API調(diào)用重試:當(dāng)達(dá)到重試次數(shù)后,增加訪問(wèn)標(biāo)記,服務(wù)降級(jí),異步探測(cè)服務(wù)是否恢復(fù)。

          WEB端:在服務(wù)不可用時(shí),web端增加重試按鈕或自動(dòng)重試可以提供更友好的體驗(yàn)。

          自動(dòng)重試需設(shè)置重試次數(shù)和數(shù)據(jù)冪等處理

          降級(jí)開(kāi)關(guān)

          在服務(wù)器提供支持期間, 如果監(jiān)控到線上一些服務(wù)存在問(wèn)題,這個(gè)時(shí)候需要暫時(shí)將這些服務(wù)去掉,有時(shí)候通過(guò)服務(wù)調(diào)用一些服務(wù),但是服務(wù)依賴(lài)的數(shù)據(jù)庫(kù)可能存在,網(wǎng)卡被打滿了,數(shù)據(jù)庫(kù)掛了,很多慢查詢(xún)等等,此時(shí)要做的就是暫停相關(guān)的系統(tǒng)服務(wù),也就是人工使用開(kāi)關(guān)降級(jí)。開(kāi)關(guān)可以放在某地,定期同步開(kāi)關(guān)數(shù)據(jù),通過(guò)判斷開(kāi)關(guān)值來(lái)決定是否做出降級(jí)。

          開(kāi)關(guān)降級(jí)還有一個(gè)作用,例如新的服務(wù)版本剛開(kāi)發(fā)處在灰度測(cè)試階段,不太確定里面的邏輯等等是否正確,如果有問(wèn)題應(yīng)該可以根據(jù)開(kāi)關(guān)的值切回舊的版本。

          在服務(wù)調(diào)用方設(shè)置一個(gè)flag,標(biāo)記服務(wù)是否可用,另外key可以存儲(chǔ)存儲(chǔ)在在本地,也可以存儲(chǔ)在第三方的配置文件中,例如數(shù)據(jù)庫(kù)、redis、zookeeper中。

          爬蟲(chóng)和機(jī)器人

          分析機(jī)器人行為:短時(shí)間連續(xù)操作,agent,行為軌跡、拖拽(模擬登陸/秒殺/灌水)

          爬蟲(chóng):引到到靜態(tài)頁(yè)或緩存頁(yè)

          讀降級(jí)

          簡(jiǎn)而言之,在一個(gè)請(qǐng)求內(nèi),多級(jí)緩存架構(gòu)下,后端緩存或db不可用,可以使用前端緩存或兜底數(shù)據(jù)讓用戶體驗(yàn)好一點(diǎn)。

          對(duì)于讀服務(wù)降級(jí)一般采用的策略有:暫時(shí)切換讀 : 降級(jí)到讀緩存、降級(jí)到走靜態(tài)化暫時(shí)屏蔽讀 : 屏蔽讀入口、屏蔽某個(gè)讀服務(wù)

          通常讀的流程為: 接入層緩存→應(yīng)用層本地緩存→分布式緩存→RPC服務(wù)/DB

          我們會(huì)在接入層、應(yīng)用層設(shè)置開(kāi)關(guān),當(dāng)分布式緩存、RPC服務(wù)/DB有問(wèn)題時(shí)自動(dòng)降級(jí)為不調(diào)用。當(dāng)然這種情況適用于對(duì)讀一致性要求不高的場(chǎng)景。

          頁(yè)面降級(jí)、頁(yè)面片段降級(jí)、頁(yè)面異步請(qǐng)求降級(jí)都是讀服務(wù)降級(jí),目的是丟卒保帥,保護(hù)核心線程,或者因數(shù)據(jù)問(wèn)題暫時(shí)屏蔽。

          還有一種是頁(yè)面靜態(tài)化場(chǎng)景。動(dòng)態(tài)化降級(jí)為靜態(tài)化 :比如,平時(shí)網(wǎng)站可以走動(dòng)態(tài)化渲染商品詳情頁(yè),但是,到了大促來(lái)臨之際可以將其切換為靜態(tài)化來(lái)減少對(duì)核心資源的占用,而且可以提升性能。其他還有如列表頁(yè)、首頁(yè)、頻道頁(yè)都可以這么處理。可以通過(guò)一個(gè)程序定期推送靜態(tài)頁(yè)到緩存或者生成到磁盤(pán),出問(wèn)題時(shí)直接切過(guò)去。靜態(tài)化降級(jí)為動(dòng)態(tài)化 :比如,當(dāng)使用靜態(tài)化來(lái)實(shí)現(xiàn)商品詳情頁(yè)架構(gòu)時(shí),平時(shí)使用靜態(tài)化來(lái)提供服務(wù),但是,因?yàn)樘厥庠蜢o態(tài)化頁(yè)面有問(wèn)題了,需要暫時(shí)切換回動(dòng)態(tài)化來(lái)保證服務(wù)正確性。以上都保證了出問(wèn)題時(shí)有預(yù)案,用戶可以繼續(xù)使用網(wǎng)站,不影響用戶購(gòu)物體驗(yàn)。

          寫(xiě)降級(jí)

          大家都知道硬盤(pán)性能比不上內(nèi)存性能,如果訪問(wèn)量很高的話,數(shù)據(jù)庫(kù)頻繁讀寫(xiě)可能撐不住,那么怎么辦呢,可以讓內(nèi)存(假如是Redis)庫(kù)來(lái)暫時(shí)滿足寫(xiě)任務(wù),同時(shí)將執(zhí)行的指令記錄下來(lái),然后將這個(gè)信息發(fā)送到數(shù)據(jù)庫(kù),也就是不在追求內(nèi)存與數(shù)據(jù)庫(kù)數(shù)據(jù)的強(qiáng)一致性,只要數(shù)據(jù)庫(kù)數(shù)據(jù)與Redis數(shù)據(jù)庫(kù)中的信息滿足最終話一致性即可。

          也就是說(shuō),正常情況下可以同步扣減庫(kù)存,在性能扛不住時(shí),降級(jí)為異步。另外,如果是秒殺場(chǎng)景可以直接降級(jí)為異步,從而保護(hù)系統(tǒng)。還有,如下單操作可以在大促時(shí)暫時(shí)降級(jí),將下單數(shù)據(jù)寫(xiě)入Redis,然后等峰值過(guò)去了再同步回DB,當(dāng)然也有更好的解決方案,但是更復(fù)雜,不是本篇的重點(diǎn)。

          還有如用戶評(píng)價(jià),如果評(píng)價(jià)量太大,那么也可以把評(píng)價(jià)從同步寫(xiě)降級(jí)為異步寫(xiě)。當(dāng)然也可以對(duì)評(píng)價(jià)按鈕進(jìn)行按比例開(kāi)放(比如,一些人看不到評(píng)價(jià)操作按鈕)。比如,評(píng)價(jià)成功后會(huì)發(fā)一些獎(jiǎng)勵(lì),在必要的時(shí)候降級(jí)同步到異步。

          總結(jié)在cap原理和BASE理論中寫(xiě)操作存在于數(shù)據(jù)一致性 這個(gè)環(huán)節(jié),降級(jí)的目的是為了提供高可用性,在多數(shù)的互聯(lián)網(wǎng)架構(gòu)中,可用性是大于數(shù)據(jù)一致性的。所以喪失寫(xiě)入數(shù)據(jù)同步,通過(guò)上面的理論,我們也能勉強(qiáng)接受數(shù)據(jù)最終一致性。高并發(fā)場(chǎng)景下,寫(xiě)入操作無(wú)法及時(shí)到達(dá)或抗壓,可以異步消費(fèi)數(shù)據(jù)/cache更新/log等方式

          前端降級(jí)

          當(dāng)系統(tǒng)出現(xiàn)問(wèn)題的時(shí)候,盡量將請(qǐng)求隔離在離用戶最近的位置,避免無(wú)效鏈路訪問(wèn), 在后端服務(wù)部分或完全不可用的時(shí)候,可以使用本地緩存或兜底數(shù)據(jù),在一些特殊場(chǎng)景下,對(duì)數(shù)據(jù)一致性要求不高的時(shí)候,比如秒殺、抽獎(jiǎng)等可以做假數(shù)據(jù)。

          JS降級(jí)

          在js中埋降級(jí)開(kāi)關(guān),在訪問(wèn)不到達(dá),系統(tǒng)閾值的時(shí)候可以避免發(fā)送請(qǐng)求

          主要控制頁(yè)面功能的降級(jí),在頁(yè)面中,通過(guò)JS腳本部署功能降級(jí)開(kāi)關(guān),在適當(dāng)時(shí)機(jī)開(kāi)啟/關(guān)閉開(kāi)關(guān)。

          接入層降級(jí)

          可以在接入層,在用戶請(qǐng)求還沒(méi)到達(dá)服務(wù)的時(shí)候,通過(guò)、Nginx + Lua、Haproxy + lua過(guò)濾無(wú)效請(qǐng)求達(dá)到服務(wù)降級(jí)的目的, 主要控制請(qǐng)求入口的降級(jí),請(qǐng)求進(jìn)入后,會(huì)首先進(jìn)入接入層,在接入層可以配置功能降級(jí)開(kāi)關(guān),可以根據(jù)實(shí)際情況進(jìn)行自動(dòng)/人工降級(jí)。這個(gè)可以參考第17章,尤其在后端應(yīng)用服務(wù)出問(wèn)題時(shí),通過(guò)接入層降級(jí)從而給應(yīng)用服務(wù)有足夠的時(shí)間恢復(fù)服務(wù)。

          應(yīng)用層降級(jí)

          主要控制業(yè)務(wù)的降級(jí),在應(yīng)用中配置相應(yīng)的功能開(kāi)關(guān),根據(jù)實(shí)際業(yè)務(wù)情況進(jìn)行自動(dòng)/人工降級(jí)。

          SpringCloud中可以通過(guò)Hystrix配置中心可以進(jìn)行人工降級(jí),也可以根據(jù)服務(wù)的超時(shí)時(shí)間進(jìn)行自動(dòng)降級(jí), Hystrix是Netflix開(kāi)源的一款針對(duì)分布式系統(tǒng)的延遲和容錯(cuò)庫(kù),目的是用來(lái)隔離分布式服務(wù)故障。它提供線程和信號(hào)量隔離,以減少不同服務(wù)之間資源競(jìng)爭(zhēng)帶來(lái)的相互影響;官網(wǎng)講Hystrix提供優(yōu)雅降級(jí)機(jī)制;提供熔斷機(jī)制使得服務(wù)可以快速失敗,而不是一直阻塞等待服務(wù)響應(yīng),并能從中快速恢復(fù)。Hystrix通過(guò)這些機(jī)制來(lái)阻止級(jí)聯(lián)失敗并保證系統(tǒng)彈性、可用。下圖是一個(gè)典型的分布式服務(wù)實(shí)現(xiàn)。


          片段降級(jí)

          例如打開(kāi)淘寶首頁(yè),這一瞬間需要加載很多數(shù)據(jù),有靜態(tài)的例如圖片、CSS、JS等,也有很多其他商品等等,這么多數(shù)據(jù)中,如果一部分沒(méi)有請(qǐng)求到,那么就可以片段降級(jí),意思是就不加載這些數(shù)據(jù)了,用其他數(shù)據(jù)頂替,例如其他商品信息或者等等。

          提前預(yù)埋

          這個(gè)很容易理解,大家應(yīng)該都記得,每次雙十一之前,淘寶總會(huì)提醒你下載更新,按道理來(lái)講,活動(dòng)還沒(méi)開(kāi)始,更新啥呢?

          做法是對(duì)于一部分靜態(tài)數(shù)據(jù)可以提前更新到你手機(jī)上,當(dāng)你雙十一時(shí)就不用再遠(yuǎn)程連接服務(wù)器加載了,避免了消耗網(wǎng)絡(luò)資源。


          往期推薦

          為什么 1/3 字節(jié)員工曾反對(duì)取消大小周?

          Spring Boot + Vue 如此強(qiáng)大,這真是一個(gè)讓人驚艷的項(xiàng)目

          用 Java 爬小姐姐圖片,這個(gè)厲害了!

          Spring Boot 接入支付寶支付的 SDK 方法

          Redis 常見(jiàn)的 16 個(gè)使用場(chǎng)景


          END



          若覺(jué)得文章對(duì)你有幫助,隨手轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動(dòng)力。


          長(zhǎng)按二維碼,掃掃關(guān)注哦

          ?「C語(yǔ)言中文網(wǎng)」官方公眾號(hào),關(guān)注手機(jī)閱讀教程??


          學(xué)習(xí)資料包括:?Java,算法,數(shù)據(jù)庫(kù),Linux,簡(jiǎn)歷,運(yùn)維?等編程分類(lèi),在不斷更新中哦


          點(diǎn)擊“閱讀原文”,馬上免費(fèi)領(lǐng)?。?/span>
          ??????
          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲区色情区激情区小说纯熟调抖 | 曰韩无码电影 | 特级无码一区二区三区 | 欧美日韩中文字 | 亚洲AV影视网 |