摘要:現(xiàn)狀分布式場(chǎng)景中。因此要對(duì)在原服務(wù)不可用時(shí)進(jìn)行熔斷降級(jí)處理。分析熔斷降級(jí)可以服務(wù)端限流網(wǎng)關(guān)限流客戶端限流。它提供兩種資源隔離的模式信號(hào)量隔離和線程池隔離。支持流控熔斷降級(jí)系統(tǒng)保護(hù)等。它支持并發(fā)數(shù)的流量控制也支持熔斷降級(jí)。
現(xiàn)狀
分布式場(chǎng)景中。若服務(wù)不穩(wěn)定,會(huì)導(dǎo)致調(diào)用方服務(wù)也不可用,從而造成雪崩效應(yīng)。因此要對(duì)在原服務(wù)不可用時(shí)進(jìn)行熔斷降級(jí)處理。
分析熔斷降級(jí)可以服務(wù)端限流、網(wǎng)關(guān)限流、客戶端限流。
1. 客戶端限流:在調(diào)用方法發(fā)起請(qǐng)求時(shí)檢查是否達(dá)到閥值。若達(dá)到閥值,不發(fā)起調(diào)用請(qǐng)求
優(yōu)點(diǎn):可以在服務(wù)消費(fèi)端直接控制流量出口,減少不必要請(qǐng)求的發(fā)起。
缺點(diǎn):客戶端需要感知服務(wù)運(yùn)行指標(biāo)和容災(zāi)規(guī)則。每個(gè)業(yè)務(wù)方需要重復(fù)開發(fā)
2. 服務(wù)端限流:服務(wù)提供方自定義容災(zāi)邏輯,在收到請(qǐng)求后再根據(jù)當(dāng)前狀態(tài)判斷是否走fallback邏輯
優(yōu)點(diǎn):容災(zāi)規(guī)則、閥值完全封裝在服務(wù)提供者。對(duì)調(diào)用方無感知。
缺點(diǎn):若服務(wù)提供者都掛了,無法進(jìn)行容災(zāi)。
3. 網(wǎng)關(guān)限流:原本直接調(diào)用提供者的請(qǐng)求都由網(wǎng)關(guān)層代理轉(zhuǎn)發(fā)。容災(zāi)規(guī)則的配置、降級(jí)邏輯都封裝在網(wǎng)關(guān)層。
優(yōu)點(diǎn):客戶端、服務(wù)端都無需感知容災(zāi)邏輯。
缺點(diǎn):多了一次網(wǎng)絡(luò)請(qǐng)求、rt變大
大部分情況下,我們都是選擇服務(wù)端限流。但客戶端對(duì)數(shù)據(jù)平臺(tái)的接口是強(qiáng)依賴的。若搜索應(yīng)用掛了,客戶端還是需要看到數(shù)據(jù)。相比高可用,略微的rt變大是可以接受的,所以啟動(dòng)一個(gè)數(shù)據(jù)容災(zāi)網(wǎng)關(guān)
技術(shù)選型現(xiàn)在了解到的開源容災(zāi)框架有hystrix、sentinel兩種。
hystrix:常用于springcloud的一個(gè)熔斷降級(jí)組件。主要功能是不同服務(wù)之間的資源隔離、失敗降級(jí)。底層實(shí)現(xiàn)是Rxjava。它提供兩種資源隔離的模式:信號(hào)量隔離和線程池隔離。一般使用線程池隔離。耗費(fèi)一定資源,但相比之下支持超時(shí)和異步執(zhí)行。聽起來可以覆蓋大部分場(chǎng)景,但它不支持更高要求的流控,如qps的控制。所以需要多帶帶采用令牌漏桶來做流量控制。
sentinel:阿里開源的分布式流量控制組件。支持流控、熔斷降級(jí)、系統(tǒng)保護(hù)等。所有的資源都對(duì)應(yīng)一個(gè)資源名稱以及一個(gè)Entry。每一個(gè)Entry創(chuàng)建的時(shí)候,同時(shí)也會(huì)創(chuàng)建一系列插件(系統(tǒng)保護(hù)插件:SystemSlot、流控插件:FlowSlot、熔斷降級(jí)插件LDegradeSlot等)。每個(gè)插件會(huì)監(jiān)控自己職責(zé)范圍內(nèi)的指標(biāo)。NodeSelectorSlot將各個(gè)資源的調(diào)用路徑以樹狀存儲(chǔ),用于限流降級(jí)。調(diào)用者通過創(chuàng)建上下文、請(qǐng)求token來執(zhí)行方法。若沒有拋出BlockException,表示請(qǐng)求成功。它支持并發(fā)數(shù)/qps的流量控制、也支持熔斷降級(jí)。
對(duì)比:1.hystrix的熔斷都圍繞線程池展開。更適合做資源隔離,但單個(gè)應(yīng)用有多個(gè)服務(wù)時(shí)線程池開銷會(huì)造成浪費(fèi)。hystrix是單個(gè)超時(shí)立即熔斷,控制力度更細(xì)。多個(gè)微服務(wù)的場(chǎng)景可以考慮用這種。2.sentinel是基于并發(fā)數(shù),支持的場(chǎng)景也更復(fù)雜,開銷小,適合在保證服務(wù)穩(wěn)定的情況下提高吞吐量。但它的超時(shí)是5次請(qǐng)求的平均響應(yīng)時(shí)間。并不是很嚴(yán)格。但對(duì)于大多數(shù)場(chǎng)景而言可以接受
接入方式sentinel支持api和注解兩種接入方式。作為容災(zāi)網(wǎng)關(guān),之后可以會(huì)接很多接口。為了接入簡(jiǎn)單、對(duì)代碼無侵入。需要使用注解的方式。但是原生的@SentinelResource有幾個(gè)問題:
1. 只能指定資源名稱、fallback方法。用戶還是需要通過api創(chuàng)建容災(zāi)規(guī)則,
2. 而且fallback方法入?yún)⒁由螧lockException。這樣的接入方式不是很優(yōu)雅。
3. 流控異常FlowException的方法要另外指定。
于是基于sentinel封裝了一層自定義注解@AegisResource
@AegisResource(value = "hello",limitThread = 0,timeOut = 100,failRate = 0.5,timeWindows = 100,fallback = "exceptionHandler")
參數(shù)說明:
value:資源名稱,默認(rèn)為方法名
limitThread:最大線程數(shù),默認(rèn)-1,即不啟用
timeOut:接口超時(shí)時(shí)間,默認(rèn)-1,即不啟用
failRate:失敗率,默認(rèn)-1,即不啟用
timeWindows:觸發(fā)降級(jí)但持續(xù)時(shí)間,默認(rèn)100
fallback:降級(jí)方法,必須指定
接入demo/** * 保護(hù)的方法 * @return */ @GetMapping("resourcetest") @AegisResource(value = "hello",limitThread = 0,timeOut = 100,failRate = 0.5,timeWindows = 100,fallback = "exceptionHandler") public String hello() { return "ok"; } /** * 降級(jí)的方法 * @return */ public String exceptionHandler() { // Do some log here. return "Oops, error occurred at " ; }
新接口只需寫好希望執(zhí)行的方法和降級(jí)方法,然后在希望執(zhí)行的方法上加入@AegisResource(fallBack=“fallback的方法名”)就可以無侵式入地進(jìn)行容災(zāi)。切面定義了默認(rèn)容災(zāi)閥值。也可以在對(duì)應(yīng)屬性上設(shè)置自定義的閥值。
后期規(guī)劃目前容災(zāi)網(wǎng)關(guān)可以滿足目前的需求。目前有開源的控制臺(tái),可以查看服務(wù)調(diào)用大盤,動(dòng)態(tài)調(diào)整容災(zāi)規(guī)則。缺點(diǎn)是目前指標(biāo)的搜集是http方式。容災(zāi)規(guī)則、運(yùn)行指標(biāo)也沒有持久化存儲(chǔ)。后期如果需要,可以借助現(xiàn)有的開源控制臺(tái)進(jìn)行二次開發(fā)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/73456.html
摘要:前言分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)為了應(yīng)對(duì)服務(wù)雪崩一種常見的做法是手動(dòng)服務(wù)降級(jí)而的出現(xiàn)給我們提供了另一種選擇服務(wù)雪崩效應(yīng)的定義服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的 前言 分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況, 這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng). 為了應(yīng)對(duì)服務(wù)雪崩, 一種常見的做法是手動(dòng)服...
摘要:前言分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)為了應(yīng)對(duì)服務(wù)雪崩一種常見的做法是手動(dòng)服務(wù)降級(jí)而的出現(xiàn)給我們提供了另一種選擇服務(wù)雪崩效應(yīng)的定義服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的 前言 分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況, 這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng). 為了應(yīng)對(duì)服務(wù)雪崩, 一種常見的做法是手動(dòng)服...
摘要:常見的降級(jí)方案表現(xiàn)形式無非以下三種類型。的級(jí)別最低最先可以被降級(jí)掉。一旦當(dāng)系統(tǒng)壓力過大的時(shí)候,先把級(jí)別的功能降級(jí)掉。降級(jí)實(shí)現(xiàn)首先要制定觸發(fā)機(jī)制。將耗時(shí)的數(shù)據(jù)落盤操作降級(jí)為異步進(jìn)行。 如果這是第二次看到我的文章,歡迎掃描文末二維碼訂閱我喲~本文長(zhǎng)度為4069字,建議閱讀11分鐘。 也許你對(duì)降級(jí)已經(jīng)有了一些認(rèn)識(shí),認(rèn)真看完,我想這篇文章可能會(huì)給你帶來一些新的收獲~ 前面兩篇我們已經(jīng)聊過了「熔...
摘要:有了分布式數(shù)據(jù)庫(kù)可以使數(shù)據(jù)庫(kù)的性能可以隨著節(jié)點(diǎn)增加線性地增加。分布式數(shù)據(jù)庫(kù)最最下面是,是主備的,通過的內(nèi)核開發(fā)能力,我們能夠?qū)崿F(xiàn)主備切換數(shù)據(jù)零丟失,所以數(shù)據(jù)落在這個(gè)里面,是非常放心的,哪怕是掛了一個(gè)節(jié)點(diǎn),切換完了以后,你的數(shù)據(jù)也是不會(huì)丟的。 此文已由作者劉超授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn) 三、微服務(wù)化的十個(gè)設(shè)計(jì)要點(diǎn) 微服務(wù)有哪些要點(diǎn)呢?第一張圖是...
摘要:故障處理設(shè)計(jì)微服務(wù)架構(gòu)所帶來的一個(gè)后果就是必須考慮每個(gè)服務(wù)的失敗容錯(cuò)機(jī)制。因此,微服務(wù)非常重視建立架構(gòu)及相關(guān)業(yè)務(wù)指標(biāo)的實(shí)時(shí)監(jiān)控和日志機(jī)制。 微服務(wù)架構(gòu)入門 1. 微服務(wù)簡(jiǎn)介 微服務(wù)是一種架構(gòu)風(fēng)格,一個(gè)大型的復(fù)雜軟件由一個(gè)或多個(gè)微服務(wù)組成。系統(tǒng)中每個(gè)微服務(wù)都可以被獨(dú)立部署,各個(gè)微服務(wù)之間是松耦合的。每個(gè)微服務(wù)僅關(guān)注于完成一件任務(wù)并很好地完成任務(wù)。在所有情況下,每個(gè)任務(wù)代表這一個(gè)小的業(yè)務(wù)能...
閱讀 1090·2021-10-08 10:04
閱讀 3528·2021-08-05 10:01
閱讀 2285·2019-08-30 11:04
閱讀 1804·2019-08-29 15:29
閱讀 852·2019-08-29 15:12
閱讀 1677·2019-08-26 12:11
閱讀 3125·2019-08-26 11:33
閱讀 1170·2019-08-26 10:23