小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

熔斷,限流,降級

 觀審美2 2019-04-07

1 寫在前面

 

1.1 名詞解釋

consumer表示服務(wù)調(diào)用方 

provider標(biāo)示服務(wù)提供方,dubbo里面一般就這么講。

下面的A調(diào)用B服務(wù),一般是泛指調(diào)用B服務(wù)里面的一個接口。

 

1.2 拓?fù)鋱D

大寫字母表示不同的服務(wù),后面的序號表示同一個服務(wù)部署在不同機(jī)器的實(shí)例。

 

2 從微觀角度思考

 

2.1 超時(shí)(timeout)

在接口調(diào)用過程中,consumer調(diào)用provider的時(shí)候,provider在響應(yīng)的時(shí)候,有可能會慢,如果provider 10s響應(yīng),那么consumer也會至少10s才響應(yīng)。如果這種情況頻度很高,那么就會整體降低consumer端服務(wù)的性能。

這種響應(yīng)時(shí)間慢的癥狀,就會像一層一層波浪一樣,從底層系統(tǒng)一直涌到最上層,造成整個鏈路的超時(shí)。

所以,consumer不可能無限制地等待provider接口的返回,會設(shè)置一個時(shí)間閾值,如果超過了這個時(shí)間閾值,就不繼續(xù)等待。

這個超時(shí)時(shí)間選取,一般看provider正常響應(yīng)時(shí)間是多少,再追加一個buffer即可。

 

2.2 重試(retry)

超時(shí)時(shí)間的配置是為了保護(hù)服務(wù),避免consumer服務(wù)因?yàn)閜rovider 響應(yīng)慢而也變得響應(yīng)很慢,這樣consumer可以盡量保持原有的性能。

但是也有可能provider只是偶爾抖動,那么超時(shí)后直接放棄,不做后續(xù)處理,就會導(dǎo)致當(dāng)前請求錯誤,也會帶來業(yè)務(wù)方面的損失。

那么,對于這種偶爾抖動,可以在超時(shí)后重試一下,重試如果正常返回了,那么這次請求就被挽救了,能夠正常給前端返回?cái)?shù)據(jù),只不過比原來響應(yīng)慢一點(diǎn)。

重試時(shí)的一些細(xì)化策略:

重試可以考慮切換一臺機(jī)器來進(jìn)行調(diào)用,因?yàn)樵瓉頇C(jī)器可能由于臨時(shí)負(fù)載高而性能下降,重試會更加劇其性能問題,而換一臺機(jī)器,得到更快返回的概率也更大一些。

 

2.2.1 冪等(idempotent)

如果允許consumer重試,那么provider就要能夠做到冪等。

即,同一個請求被consumer多次調(diào)用,對provider產(chǎn)生的影響(這里的影響一般是指某些寫入相關(guān)的操作) 是一致的。

而且這個冪等應(yīng)該是服務(wù)級別的,而不是某臺機(jī)器層面的,重試調(diào)用任何一臺機(jī)器,都應(yīng)該做到冪等。

 

2.3 熔斷(circuit break)

重試是為了應(yīng)付偶爾抖動的情況,以求更多地挽回?fù)p失。

可是如果provider持續(xù)的響應(yīng)時(shí)間超長呢?

如果provider是核心路徑的服務(wù),down掉基本就沒法提供服務(wù)了,那我們也沒話說。 如果是一個不那么重要的服務(wù),卻因?yàn)檫@個服務(wù)一直響應(yīng)時(shí)間長導(dǎo)致consumer里面的核心服務(wù)也拖慢,那么就得不償失了。

單純超時(shí)也解決不了這種情況了,因?yàn)橐话愠瑫r(shí)時(shí)間,都比平均響應(yīng)時(shí)間長一些,現(xiàn)在所有的打到provider的請求都超時(shí)了,那么consumer請求provider的平均響應(yīng)時(shí)間就等于超時(shí)時(shí)間了,負(fù)載也被拖下來了。

而重試則會加重這種問題,使consumer的可用性變得更差。

因此就出現(xiàn)了熔斷的邏輯,也就是,如果檢查出來頻繁超時(shí),就把consumer調(diào)用provider的請求,直接短路掉,不實(shí)際調(diào)用,而是直接返回一個mock的值。

等provider服務(wù)恢復(fù)穩(wěn)定之后,重新調(diào)用。

 

2.3.1 簡單的熔斷處理邏輯

目前我們框架有通過注解使用的熔斷器,大家可以參考應(yīng)用在項(xiàng)目中。

 

2.4 限流(current limiting)

上面幾個策略都是consumer針對provider出現(xiàn)各種情況而設(shè)計(jì)的。

而provider有時(shí)候也要防范來自consumer的流量突變問題。

這樣一個場景,provider是一個核心服務(wù),給N個consumer提供服務(wù),突然某個consumer抽風(fēng),流量飆升,占用了provider大部分機(jī)器時(shí)間,導(dǎo)致其他可能更重要的consumer不能被正常服務(wù)。

所以,provider端,需要根據(jù)consumer的重要程度,以及平時(shí)的QPS大小,來給每個consumer設(shè)置一個流量上線,同一時(shí)間內(nèi)只會給A consumer提供N個線程支持,超過限制則等待或者直接拒絕。

 

2.4.1 資源隔離

provider可以對consumer來的流量進(jìn)行限流,防止provider被拖垮。 

同樣,consumer 也需要對調(diào)用provider的線程資源進(jìn)行隔離。 這樣可以確保調(diào)用某個provider邏輯不會耗光整個consumer的線程池資源。

 

2.4.2 服務(wù)降級

降級服務(wù)既可以代碼自動判斷,也可以人工根據(jù)突發(fā)情況切換。

 

2.4.2.1 consumer 端

consumer 如果發(fā)現(xiàn)某個provider出現(xiàn)異常情況,比如,經(jīng)常超時(shí)(可能是熔斷引起的降級),數(shù)據(jù)錯誤,這是,consumer可以采取一定的策略,降級provider的邏輯,基本的有直接返回固定的數(shù)據(jù)。

 

2.4.2.2 provider 端

當(dāng)provider 發(fā)現(xiàn)流量激增的時(shí)候,為了保護(hù)自身的穩(wěn)定性,也可能考慮降級服務(wù)。 

比如,1,直接給consumer返回固定數(shù)據(jù),2,需要實(shí)時(shí)寫入數(shù)據(jù)庫的,先緩存到隊(duì)列里,異步寫入數(shù)據(jù)庫。

 

 

3 從宏觀角度重新思考

宏觀包括比A -> B 更復(fù)雜的長鏈路。

長鏈路就是 A -> B -> C -> D這樣的調(diào)用環(huán)境。

而且一個服務(wù)也會多機(jī)部署,A 服務(wù)實(shí)際會存在 A1,A2,A3 …

微觀合理的問題,宏觀未必合理。

下面的一些討論,主要想表達(dá)的觀點(diǎn)是:如果系統(tǒng)復(fù)雜了,系統(tǒng)的容錯配置要整體來看,整體把控,才能做到更有意義。

 

3.1 超時(shí)

如果A給B設(shè)置的超時(shí)時(shí)間,比B給C設(shè)置的超時(shí)時(shí)間短,那么肯定不合理把,A超時(shí)時(shí)間到了直接掛斷,B對C支持太長超時(shí)時(shí)間沒意義。

R表示服務(wù)consumer自身內(nèi)部邏輯執(zhí)行時(shí)間,TAB表示consumer A開始調(diào)用provider B到返回的時(shí)間 。

那么那么TAB > RB + TBC 才對。

 

3.2 重試

重試跟超時(shí)面臨的問題差不多。

B服務(wù)一般100ms返回,所以A就給B設(shè)置了110ms的超時(shí),而B設(shè)置了對C的一次重試,最終120ms正確返回了,但是A的超時(shí)時(shí)間比較緊,所以B對C的重試被白白浪費(fèi)了。

A也可能對B進(jìn)行重試,但是由于上一條我們講到的,可能C確實(shí)性能不好,每次B重試一下就OK,但是A兩次重試其實(shí)都無法正確的拿到結(jié)果。

N標(biāo)示設(shè)置的重試次數(shù)

修正一下上面section的公式,TAB > RB+TBC * N。

雖然這個公式本身沒什么問題,但是,如果站在長鏈路的視角來思考,我們需要整體規(guī)劃每個服務(wù)的超時(shí)時(shí)間和重試次數(shù),而不是僅僅公式成立即可。

比如下面情況:

A -> B -> C。

RB = 100ms,TBC=10ms

B是個核心服務(wù),B的計(jì)算成本特別大,那么A就應(yīng)該盡量給B長一點(diǎn)的超時(shí)時(shí)間,而盡量不要重試調(diào)用B,而B如果發(fā)現(xiàn)C超時(shí)了,B可以多調(diào)用幾次C,因?yàn)橹卦嘋成本小,而重試B成本則很高。 so …

 

3.3 熔斷

A -> B -> C,如果C出現(xiàn)問題了,那么B熔斷了,則A就不用熔斷了。

 

3.4 限流

B只允許A以QPS<=5的流量請求,而C卻只允許B以QPS<=3的qps請求,那么B給A的設(shè)定就有點(diǎn)大,上游的設(shè)置依賴下游。

而且限流對QPS的配置,可能會隨著服務(wù)加減機(jī)器而變化,最好是能在集群層面配置,自動根據(jù)集群大小調(diào)整。

 

3.5 服務(wù)降級

服務(wù)降級這個問題,如果從整體來操作,

1,一定是先降級優(yōu)先級地的接口,兩權(quán)相害取其輕 

2,如果服務(wù)鏈路整體沒有性能特別差的點(diǎn),比如就是外部流量突然激增,那么就從外到內(nèi)開始降級。 

3如果某個服務(wù)能檢測到自身負(fù)載上升,那么可以從這個服務(wù)自身做降級。

 

3.6 漣漪

A -> B -> C,如果C服務(wù)出現(xiàn)抖動,而B沒有處理好這個抖動,造成B服務(wù)也出現(xiàn)了抖動,A調(diào)用B的時(shí)候,也會出現(xiàn)服務(wù)抖動的情況。

這個暫時(shí)的不可用狀態(tài)就想波浪一樣從底層傳遞到了上層。

所以,從整個體系的角度來看,每個服務(wù)一定要盡量控制住自己下游服務(wù)的抖動,不要讓整個體系跟著某個服務(wù)抖動。

 

3.7 級聯(lián)失敗(cascading failure)

系統(tǒng)中有某個服務(wù)出現(xiàn)故障,不可用,傳遞性地導(dǎo)致整個系統(tǒng)服務(wù)不可用的問題。

跟上面漣漪(自造詞)的區(qū)別也就是嚴(yán)重性的問題。

漣漪描述服務(wù)偶發(fā)的不穩(wěn)定層層傳遞,而級聯(lián)失敗基本是導(dǎo)致系統(tǒng)不可用。 一般,前者可能會因?yàn)槎虝r(shí)間內(nèi)恢復(fù)而未引起重視,而后者一般會被高度重視。

 

3.8 關(guān)鍵路徑

關(guān)鍵路徑就是,你的服務(wù)想正常工作,必須要完整依賴的下游服務(wù)鏈,比如數(shù)據(jù)庫一般就是關(guān)鍵路徑里面的一個節(jié)點(diǎn)。

盡量減少關(guān)鍵路徑依賴的數(shù)量,是提高服務(wù)穩(wěn)定性的一個措施。

數(shù)據(jù)庫一般在服務(wù)體系的最底層,如果你的服務(wù)可以會自己完整緩存使用的數(shù)據(jù),解除數(shù)據(jù)庫依賴,那么數(shù)據(jù)庫掛掉,你的服務(wù)就暫時(shí)是安全的。

 

3.9 最長路徑

想要優(yōu)化你的服務(wù)的響應(yīng)時(shí)間,需要看服務(wù)調(diào)用邏輯里面的最長路徑,只有縮短最長時(shí)間路徑的用時(shí),才能提高你的服務(wù)的性能。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多