成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

十張圖帶你徹底搞懂限流、熔斷、服務(wù)降級

新聞 前端
今天我們來聊一聊系統(tǒng)容錯中的限流、熔斷和服務(wù)降級。

 [[430448]]

在分布式系統(tǒng)中,如果某個服務(wù)節(jié)點(diǎn)發(fā)生故障或者網(wǎng)絡(luò)發(fā)生異常,都有可能導(dǎo)致調(diào)用方被阻塞等待,如果超時時間設(shè)置很長,調(diào)用方資源很可能被耗盡。這又導(dǎo)致了調(diào)用方的上游系統(tǒng)發(fā)生資源耗盡的情況,最終導(dǎo)致系統(tǒng)雪崩。

如下圖:

如果 D 服務(wù)發(fā)生了故障不能響應(yīng), B 服務(wù)調(diào)用 D 時只能阻塞等待。假如 B 服務(wù)調(diào)用 D 服務(wù)設(shè)置超時時間是 10 秒,請求速率是每秒 100 個,那 10 秒內(nèi)就會有 1000 個請求線程被阻塞等待,如果 B 的線程池大小設(shè)置 1000 ,那 B 系統(tǒng)因?yàn)榫€程資源耗盡已經(jīng)不能對外提供服務(wù)了。而這又影響了入口系統(tǒng) A 的服務(wù),最終導(dǎo)致系統(tǒng)全面崩潰。

提高系統(tǒng)的整體容錯能力是防止系統(tǒng)雪崩的有效手段。

在 Martin Fowler 和 James Lewis 的文章 《Microservices: a definition of this new architectural term》 [1] 中,提出了微服務(wù)的 9 個特征,其中一個是容錯設(shè)計。

要防止系統(tǒng)發(fā)生雪崩,就必須要有容錯設(shè)計。如果遇到突增流量,一般的做法是對非核心業(yè)務(wù)功能采用熔斷和服務(wù)降級的措施來保護(hù)核心業(yè)務(wù)功能正常服務(wù),而對于核心功能服務(wù),則需要采用限流的措施。

今天我們來聊一聊系統(tǒng)容錯中的限流、熔斷和服務(wù)降級。

當(dāng)系統(tǒng)的處理能力不能應(yīng)對外部請求的突增流量時,為了不讓系統(tǒng)奔潰,必須采取限流的措施。

1.1 限流指標(biāo)

1.1.1 TPS

系統(tǒng)吞吐量是衡量系統(tǒng)性能的關(guān)鍵指標(biāo),按照事務(wù)的完成數(shù)量來限流是最合理的。

但是對實(shí)操性來說,按照事務(wù)來限流并不現(xiàn)實(shí)。在分布式系統(tǒng)中完成一筆事務(wù)需要多個系統(tǒng)的配合。比如我們在電商系統(tǒng)購物,需要訂單、庫存、賬戶、支付等多個服務(wù)配合完成,有的服務(wù)需要異步返回,這樣完成一筆事務(wù)花費(fèi)的時間可能會很長。如果按照 TPS 來進(jìn)行限流,時間粒度可能會很大大,很難準(zhǔn)確評估系統(tǒng)的響應(yīng)性能。

1.1.2 HPS

每秒請求數(shù),指每秒鐘服務(wù)端收到客戶端的請求數(shù)量。

如果一個請求完成一筆事務(wù),那 TPS 和 HPS 是等同的。但在分布式場景下,完成一筆事務(wù)可能需要多次請求,所以 TPS 和 HPS 指標(biāo)不能等同看待。

1.1.3 QPS

服務(wù)端每秒能夠響應(yīng)的客戶端查詢請求數(shù)量。

如果后臺只有一臺服務(wù)器,那 HPS 和 QPS 是等同的。但是在分布式場景下,每個請求需要多個服務(wù)器配合完成響應(yīng)。

目前主流的限流方法多采用 HPS 作為限流指標(biāo)。

1.2 限流方法

1.2.1 流量計數(shù)器

這是最簡單直接的方法,比如限制每秒請求數(shù)量 100 ,超過 100 的請求就拒絕掉。

但是這個方法存在 2 個明顯的問題:

  • 單位時間(比如 1s )很難把控,如下圖:

這張圖上,從下面時間看, HPS 沒有超過 100 ,但是從上面看 HPS 超過 100 了。

  • 有一段時間流量超了,也不一定真的需要限流,如下圖,系統(tǒng) HPS 限制 50 ,雖然前 3s 流量超了,但是如果讀超時時間設(shè)置為 5s ,并不需要限流。

1.2.2 滑動時間窗口

滑動時間窗口算法是目前比較流行的限流算法,主要思想是把時間看做是一個向前滾動的窗口,如下圖:

開始的時候,我們把 t1~t5 看做一個時間窗口,每個窗口 1s ,如果我們定的限流目標(biāo)是每秒 50 個請求,那 t1~t5 這個窗口的請求總和不能超過 250 個。

這個窗口是滑動的,下一秒的窗口成了 t2~t6 ,這時把 t1 時間片的統(tǒng)計拋棄,加入 t6 時間片進(jìn)行統(tǒng)計。這段時間內(nèi)的請求數(shù)量也不能超過 250 個。

滑動時間窗口的優(yōu)點(diǎn)是解決了流量計數(shù)器算法的缺陷,但是也有 2 個問題:

  • 流量超過就必須拋棄或者走降級邏輯

  • 對流量控制不夠精細(xì),不能限制集中在短時間內(nèi)的流量,也不能削峰填谷

1.2.3 漏桶算法

漏桶算法的思想如下圖:

在客戶端的請求發(fā)送到服務(wù)器之前,先用漏桶緩存起來,這個漏桶可以是一個長度固定的隊(duì)列,這個隊(duì)列中的請求均勻的發(fā)送到服務(wù)端。

如果客戶端的請求速率太快,漏桶的隊(duì)列滿了,就會被拒絕掉,或者走降級處理邏輯。這樣服務(wù)端就不會受到突發(fā)流量的沖擊。

漏桶算法的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,可以使用消息隊(duì)列來削峰填谷。

但是也有 3 個問題需要考慮:

  • 漏桶的大小,如果太大,可能給服務(wù)端帶來較大處理壓力,太小可能會有大量請求被丟棄。

  • 漏桶給服務(wù)端的請求發(fā)送速率。

  • 使用緩存請求的方式,會使請求響應(yīng)時間變長。

漏桶大小和發(fā)送速率這 2 個值在項(xiàng)目上線初期都會根據(jù)測試結(jié)果選擇一個值,但是隨著架構(gòu)的改進(jìn)和集群的伸縮,這 2 個值也會隨之發(fā)生改變。

1.2.4 令牌桶算法

令牌桶算法就跟病人去醫(yī)院看病一樣,找醫(yī)生之前需要先掛號,而醫(yī)院每天放的號是有限的。當(dāng)天的號用完了,第二天又會放一批號。

算法的基本思想就是周期性的執(zhí)行下面的流程:

客戶端在發(fā)送請求時,都需要先從令牌桶中獲取令牌,如果取到了,就可以把請求發(fā)送給服務(wù)端,取不到令牌,就只能被拒絕或者走服務(wù)降級的邏輯。如下圖:

令牌桶算法解決了漏桶算法的問題,而且實(shí)現(xiàn)并不復(fù)雜,使用信號量就可以實(shí)現(xiàn)。在實(shí)際限流場景中使用最多,比如 google 的 guava 中就實(shí)現(xiàn)了令牌桶算法限流,感興趣可以研究一下。

1.2.5 分布式限流

如果在分布式系統(tǒng)場景下,上面介紹的 4 種限流算法是否還適用呢?

以令牌桶算法為例,假如在電商系統(tǒng)中客戶下了一筆訂單,如下圖:

如果我們把令牌桶單獨(dú)保存在一個地方(比如 redis 中)供整個分布式系統(tǒng)用,那客戶端在調(diào)用組合服務(wù),組合服務(wù)調(diào)用訂單、庫存和賬戶服務(wù)都需要跟令牌桶交互,交互次數(shù)明顯增加了很多。

有一種改進(jìn)就是客戶端調(diào)用組合服務(wù)之前首先獲取四個令牌,調(diào)用組合服務(wù)時減去一個令牌并且傳遞給組合服務(wù)三個令牌,組合服務(wù)調(diào)用下面三個服務(wù)時依次消耗一個令牌。

1.2.6 hystrix限流

hystrix可以使用信號量和線程池來進(jìn)行限流。

1.2.6.1 信號量限流

hystrix 可以使用信號量進(jìn)行限流,比如在提供服務(wù)的方法上加下面的注解。這樣只能有20個并發(fā)線程來訪問這個方法,超過的就被轉(zhuǎn)到了errMethod這個降級方法。

  1. @HystrixCommand
  2.  commandProperties= { 
  3.    @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"), 
  4.    @HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="20"
  5.  }, 
  6.  fallbackMethod = "errMethod" 

1.2.6.2 線程池限流

hystrix 也可以使用線程池進(jìn)行限流,在提供服務(wù)的方法上加下面的注解,當(dāng)線程數(shù)量

  1. @HystrixCommand
  2.     commandProperties = { 
  3.             @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"
  4.     }, 
  5.     threadPoolKey = "createOrderThreadPool"
  6.     threadPoolProperties = { 
  7.             @HystrixProperty(name = "coreSize", value = "20"), 
  8.    @HystrixProperty(name = "maxQueueSize", value = "100"), 
  9.             @HystrixProperty(name = "maximumSize", value = "30"), 
  10.             @HystrixProperty(name = "queueSizeRejectionThreshold", value = "120"
  11.     }, 
  12.     fallbackMethod = "errMethod" 

這里要注意:在 java 的線程池中,如果線程數(shù)量超過 coreSize ,創(chuàng)建線程請求會優(yōu)先進(jìn)入隊(duì)列,如果隊(duì)列滿了,就會繼續(xù)創(chuàng)建線程直到線程數(shù)量達(dá)到 maximumSize ,之后走拒絕策略。但在hystrix配置的線程池中多了一個參數(shù) queueSizeRejectionThreshold ,如果 queueSizeRejectionThreshold < maxQueueSize ,隊(duì)列數(shù)量達(dá)到 queueSizeRejectionThreshold 就會走拒絕策略了,因此 maximumSize 失效了。如果 queueSizeRejectionThreshold > maxQueueSize ,隊(duì)列數(shù)量達(dá)到 maxQueueSize 時, maximumSize 是有效的,系統(tǒng)會繼續(xù)創(chuàng)建線程直到數(shù)量達(dá)到 maximumSize 。Hytrix線程池設(shè)置坑 [2]

相信大家對斷路器并不陌生,它就相當(dāng)于一個開關(guān),打開后可以阻止流量通過。比如保險絲,當(dāng)電流過大時,就會熔斷,從而避免元器件損壞。

服務(wù)熔斷是指調(diào)用方訪問服務(wù)時通過斷路器做代理進(jìn)行訪問,斷路器會持續(xù)觀察服務(wù)返回的成功、失敗的狀態(tài),當(dāng)失敗超過設(shè)置的閾值時斷路器打開,請求就不能真正地訪問到服務(wù)了。

為了更好地理解,我畫了下面的時序圖:

可以參考 Martin Fowler 的論文《CircuitBreaker》 [3] 。

2.1 斷路器的狀態(tài)

斷路器有 3 種狀態(tài):

  • CLOSED :默認(rèn)狀態(tài)。斷路器觀察到請求失敗比例沒有達(dá)到閾值,斷路器認(rèn)為被代理服務(wù)狀態(tài)良好。
  • OPEN :斷路器觀察到請求失敗比例已經(jīng)達(dá)到閾值,斷路器認(rèn)為被代理服務(wù)故障,打開開關(guān),請求不再到達(dá)被代理的服務(wù),而是快速失敗。
  •  
    1. HALF OPEN 
    2. CLOSED 
    3. OPEN 

斷路器的狀態(tài)切換圖如下:

2.2 需要考慮的問題

使用斷路器需要考慮一些問題:

  • 針對不同的異常,定義不同的熔斷后處理邏輯。

  • 設(shè)置熔斷的時長,超過這個時長后切換到 HALF OPEN 進(jìn)行重試。
  • 記錄請求失敗日志,供監(jiān)控使用。

  •  
    1. connection timeout 
    2. telenet 
    3. HALF OPEN 
  • 補(bǔ)償接口,斷路器可以提供補(bǔ)償接口讓運(yùn)維人員手工關(guān)閉。

  • 重試時,可以使用之前失敗的請求進(jìn)行重試,但一定要注意業(yè)務(wù)上是否允許這樣做。

2.3 使用場景

  • 服務(wù)故障或者升級時,讓客戶端快速失敗

  • 失敗處理邏輯容易定義

  • 響應(yīng)耗時較長,客戶端設(shè)置的 read timeout 會比較長,防止客戶端大量重試請求導(dǎo)致的連接、線程資源不能釋放

3 服務(wù)降級

前面講了限流和熔斷,相比來說,服務(wù)降級是站在系統(tǒng)全局的視角來考慮的。

在服務(wù)發(fā)生熔斷后,一般會讓請求走事先配置的處理方法,這個處理方法就是一個降級邏輯。

服務(wù)降級是對非核心、非關(guān)鍵的服務(wù)進(jìn)行降級。

3.1 使用場景

  • 服務(wù)處理異常,把異常信息直接反饋給客戶端,不再走其他邏輯

  • 服務(wù)處理異常,把請求緩存下來,給客戶端返回一個中間態(tài),事后再重試緩存的請求

  • 監(jiān)控系統(tǒng)檢測到突增流量,為了避免非核心業(yè)務(wù)功能耗費(fèi)系統(tǒng)資源,關(guān)閉這些非核心功能

  • 數(shù)據(jù)庫請求壓力大,可以考慮返回緩存中的數(shù)據(jù)

  • 對于耗時的寫操作,可以改為異步寫

  • 暫時關(guān)閉跑批任務(wù),以節(jié)省系統(tǒng)資源

3.2 使用hystrix降級

3.2.1 異常降級

hystrix降級時可以忽略某個異常,在方法上加上 @HystrixCommand 注解:

下面的代碼定義降級方法是 errMethod ,對 ParamErrorException 和 BusinessTypeException 這兩個異常不做降級處理。

  1. @HystrixCommand
  2.  fallbackMethod = "errMethod"
  3.  ignoreExceptions = {ParamErrorException.class, BusinessTypeException.class

3.2.2 調(diào)用超時降級

專門針對調(diào)用第三方接口超時降級。

下面的方法是調(diào)用第三方接口3秒未收到響應(yīng)就降級到errMethod方法。

  1. @HystrixCommand
  2.     commandProperties = { 
  3.             @HystrixProperty(name="execution.timeout.enabled", value="true"), 
  4.             @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000"), 
  5.     }, 
  6.     fallbackMethod = "errMethod" 

限流、熔斷和服務(wù)降級是系統(tǒng)容錯的重要設(shè)計模式,從一定意義上講限流和熔斷也是一種服務(wù)降級的手段。

熔斷和服務(wù)降級主要是針對非核心業(yè)務(wù)功能,而核心業(yè)務(wù)如果流程超過預(yù)估的峰值,就需要進(jìn)行限流。

對于限流,選擇合理的限流算法很重要,令牌桶算法優(yōu)勢很明顯,也是使用最多的限流算法。

在系統(tǒng)設(shè)計的時候,這些模式需要配合業(yè)務(wù)量的預(yù)估、性能測試的數(shù)據(jù)進(jìn)行相應(yīng)閾值的配置,而這些閾值最好保存在配置中心,方便實(shí)時修改。

 

責(zé)任編輯:張燕妮 來源: 程序員jinjunzhu
相關(guān)推薦

2022-03-07 17:43:30

注冊微服務(wù)架構(gòu)

2025-03-26 00:58:14

2021-05-07 17:11:19

負(fù)載均衡運(yùn)維服務(wù)

2022-04-11 11:55:34

架構(gòu)技術(shù)調(diào)優(yōu)

2024-11-29 16:02:17

2022-02-28 11:10:42

ZGCG1收集器

2021-11-08 15:12:48

排序算法面試

2022-09-26 11:32:14

用戶分層服務(wù)業(yè)務(wù)

2021-03-18 12:16:44

用戶分層業(yè)務(wù)

2022-07-05 11:18:50

數(shù)據(jù)分析銷售業(yè)績

2021-01-28 11:39:01

數(shù)據(jù)分析銷售

2018-05-28 21:17:57

大數(shù)據(jù)分析軟件

2020-09-03 09:38:06

ElasticsearES Lucene

2022-02-16 18:00:19

動態(tài)代理代碼靜態(tài)代理

2021-03-23 10:25:05

Redis數(shù)據(jù)結(jié)構(gòu)

2020-12-14 10:15:03

負(fù)載均衡器Linux服務(wù)器

2022-07-11 11:06:11

RocketMQ函數(shù).消費(fèi)端

2022-01-05 14:30:44

容器Linux網(wǎng)絡(luò)

2022-02-11 20:45:42

HTTPHTTPS協(xié)議

2020-11-02 12:50:29

分布式系統(tǒng)服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕成人av | 久久久久久国产精品免费免费狐狸 | 精品欧美黑人一区二区三区 | 亚洲毛片一区二区 | 中文在线一区二区 | 亚洲一区二区久久 | 91在线资源 | 欧美在线高清 | 亚洲欧美中文日韩在线 | 日本涩涩视频 | 国产精品综合视频 | 自拍亚洲 | 高清人人天天夜夜曰狠狠狠狠 | 久久久精品网站 | 国产一区不卡在线观看 | 中文字幕第二区 | 日韩成人精品在线 | 久久国产精品视频 | 中文字幕专区 | 亚州精品天堂中文字幕 | 日韩一区在线观看视频 | 久久久婷 | 国产免费视频在线 | 国产专区在线 | 日韩精品在线一区 | 亚洲一区二区三区桃乃木香奈 | 久久9热| 日韩精品福利 | 97caoporn国产免费人人 | 午夜国产一级 | a级片在线观看 | 久久99精品久久久久久 | 521av网站| 福利视频网 | 久久久久国产精品一区 | 欧美一区视频 | 亚洲精品无 | 欧美日韩国产精品一区二区 | 久久免费精品 | 成人欧美一区二区三区黑人孕妇 | 久久成人18免费网站 |