1、Sentinel與Hystrix的區(qū)別
線程隔離有兩種方式實(shí)現(xiàn):
- 線程池隔離(Hystrix默認(rèn)采用)
- 信號(hào)量隔離(Sentinel默認(rèn)采用)
服務(wù)I需要遠(yuǎn)程調(diào)用服務(wù)A、服務(wù)B,則創(chuàng)建兩個(gè)線程池,分別用來(lái)處理服務(wù)I–>服務(wù)A,和服務(wù)I–>服務(wù)B的請(qǐng)求。和線程池隔離不同的是,信號(hào)量隔離比較輕量級(jí),就維護(hù)一個(gè)計(jì)數(shù)器就好,不用去維護(hù)線程數(shù)量。二者的優(yōu)缺點(diǎn)來(lái)說(shuō),線程池隔離的優(yōu)點(diǎn)是:
- 支持主動(dòng)超時(shí):線程是我定義的,我自己可以來(lái)中斷、超時(shí)
- 支持異步調(diào)用
缺點(diǎn)則是:
- 線程的額外開(kāi)銷比較大
總結(jié)就是:
Hystix默認(rèn)是基于線程池實(shí)現(xiàn)的線程隔離,每一個(gè)被隔離的業(yè)務(wù)都要?jiǎng)?chuàng)建一個(gè)獨(dú)立的線程池,線程過(guò)多會(huì)帶來(lái)額外的CPU開(kāi)銷,性能一般,但是隔離性更強(qiáng)
。Sentinel是基于信號(hào)量(計(jì)數(shù)器)實(shí)現(xiàn)的線程隔離,不用創(chuàng)建線程池,性能較好,但是隔離性一般
。
2、限流算法
限流:對(duì)應(yīng)用服務(wù)器的請(qǐng)求做限制,避免因過(guò)多請(qǐng)求而導(dǎo)致服務(wù)器過(guò)載甚至宕機(jī)。
限流算法常見(jiàn)的包括兩種:
- 計(jì)數(shù)器算法,又包括窗口計(jì)數(shù)器算法、滑動(dòng)窗口計(jì)數(shù)器算法
- 令牌桶算法(Token Bucket)
- 漏桶算法(Leaky Bucket)
計(jì)數(shù)器算法之固定窗口計(jì)數(shù)器算法:
固定窗口計(jì)數(shù)器的實(shí)現(xiàn)為:
- 將時(shí)間劃分為多個(gè)窗口,窗口的時(shí)間跨度稱為Interval,比如取1000ms
- 每個(gè)窗口維護(hù)一個(gè)計(jì)數(shù)器,每有一次請(qǐng)求就將計(jì)數(shù)器加一,限流就是設(shè)置計(jì)數(shù)器閾值,本例為3
- 當(dāng)該窗口所在時(shí)間里,請(qǐng)求數(shù)超過(guò)閾值,則超出部分的請(qǐng)求直接都被丟棄
固定窗口計(jì)數(shù),有個(gè)問(wèn)題就是:如下圖,當(dāng)4000-5000ms的前500ms沒(méi)請(qǐng)求,4500-5000ms剛好三個(gè)請(qǐng)求,此時(shí),未達(dá)閾值。5000-6000ms中,前500ms有三個(gè)請(qǐng)求,后500ms沒(méi)請(qǐng)求,則5000-6000也未達(dá)閾值。但從4500-5500ms這一秒,則有6個(gè)請(qǐng)求,如果服務(wù)真的最多只能承受QPS3,則這樣服務(wù)可能宕機(jī)。
計(jì)數(shù)器算法之滑動(dòng)窗口計(jì)數(shù)器算法:
滑動(dòng)窗口計(jì)數(shù)器算法會(huì)將一個(gè)窗口劃分為n個(gè)更小的區(qū)間:(在窗口的基礎(chǔ)上引入?yún)^(qū)間的概念)
- 窗口時(shí)間跨度Interval為1秒;區(qū)間數(shù)量 n = 2 ,則每個(gè)小區(qū)間時(shí)間跨度為500ms
- 限流閾值依然為3,時(shí)間窗口(1秒)內(nèi)請(qǐng)求超過(guò)閾值時(shí),超出的請(qǐng)求被限流
- 此時(shí)的窗口不再是固定的1000-2000ms或者1500-2500ms,而是 根據(jù)當(dāng)前請(qǐng)求所在時(shí)間(currentTime)移動(dòng) ,
這個(gè)滑動(dòng)窗口范圍是從(currentTime減去Interval)之后的第一個(gè)時(shí)區(qū)開(kāi)始,到currentTime所在時(shí)區(qū)結(jié)束,來(lái)做為統(tǒng)計(jì)的窗口
舉個(gè)例子:如上圖,比如1250ms有個(gè)請(qǐng)求進(jìn)來(lái),則1250-1000=250,250ms之后的第一個(gè)時(shí)區(qū)則是500到1000區(qū)間,1250ms自身所在時(shí)區(qū)為1000到1500ms,所以對(duì)應(yīng)的滑動(dòng)窗口就是500到1500ms這個(gè)時(shí)區(qū)。(圖中紫色虛線)
如上圖,再往后,1300ms有個(gè)請(qǐng)求,此時(shí),滑動(dòng)窗口計(jì)算后還是500-1500ms,這個(gè)窗口當(dāng)前共有三個(gè)請(qǐng)求,分別在900ms、1250ms、1300ms到達(dá)。此時(shí)1400ms再來(lái)一個(gè),滑動(dòng)窗口計(jì)算后還是500-1500ms,但顯然這個(gè)窗口QPS已經(jīng)到3了,1400ms的請(qǐng)求會(huì)被丟棄。到此,固定窗口的統(tǒng)計(jì)問(wèn)題得到了解決。
再往后,2100ms,則計(jì)算后,滑動(dòng)窗口在1500到2500ms(紫色虛線),未達(dá)QPS閾值,但看1250ms到2100ms這850ms的時(shí)間,不到一個(gè)窗口時(shí)間跨度Interval,卻有4個(gè)請(qǐng)求 > 3 。這個(gè)就是區(qū)間劃分的問(wèn)題了,區(qū)間越小,則限流越準(zhǔn)。 比如以125ms為一個(gè)區(qū)間,2100-1000=1100,在1000到1125區(qū)間,下一個(gè)為1125到1250,所以滑動(dòng)窗口為1125到2125ms,這個(gè)窗口已有1250、1300、1600到的三個(gè)請(qǐng)求,因此2100會(huì)被丟棄。
當(dāng)然,不管這個(gè)區(qū)間多小,總有可能有卡邊界前后請(qǐng)求導(dǎo)致QPS超過(guò)的情況??紤]上現(xiàn)實(shí)世界,這個(gè)窗口是沒(méi)必要設(shè)置成極限值的,比如1ms,差不多100ms就已經(jīng)可以解決大多情況。
令牌桶算法:
- 以固定的速率生成令牌,存入令牌桶中,如果令牌桶滿了以后,多余令牌丟棄
- 請(qǐng)求進(jìn)入后,必須先嘗試從桶中獲取令牌,獲取到令牌后才可以被處理
- 如果令牌桶中沒(méi)有令牌,則請(qǐng)求等待或丟棄
漏桶算法:
- 將每個(gè)請(qǐng)求視作"水滴"放入"漏桶"進(jìn)行存儲(chǔ)
- "漏桶"以固定速率向外"漏"出請(qǐng)求來(lái)執(zhí)行,如果"漏桶"空了則停止"漏水”
- 如果"漏桶"滿了則多余的"水滴"會(huì)被直接丟棄
- 可以理解成請(qǐng)求在桶內(nèi)排隊(duì)等待
Sentinel在實(shí)現(xiàn)漏桶算法時(shí),采用了排隊(duì)等待模式。讓所有請(qǐng)求進(jìn)入一個(gè)隊(duì)列中,然后按照閾值允許的時(shí)間間隔依次執(zhí)行。并發(fā)的多個(gè)請(qǐng)求必須等待,預(yù)期的等待時(shí)長(zhǎng) =最近一次請(qǐng)求的預(yù)期等待時(shí)間 + 允許的間隔。如果請(qǐng)求預(yù)期的等待時(shí)間超出最大時(shí)長(zhǎng),則會(huì)被拒絕。
例如:
- QPS = 5,意味著每200ms處理一個(gè)隊(duì)列中的請(qǐng)求;
- timeout = 2000,意味著預(yù)期等待超過(guò)2000ms的請(qǐng)求會(huì)被拒絕并拋出異常
3、限流算法對(duì)比
因?yàn)橛?jì)數(shù)器算法一般都會(huì)采用滑動(dòng)窗口計(jì)數(shù)器,所以這里我們對(duì)比三種算法:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-699546.html
4、Sentinel限流與Gateway限流
限流算法常見(jiàn)的有三種實(shí)現(xiàn):滑動(dòng)時(shí)間窗口、令牌桶算法、漏桶算法。Gateway則采用了基于Redis實(shí)現(xiàn)的令牌桶算法。而Sentinel內(nèi)部卻比較復(fù)雜:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-699546.html
- 默認(rèn)限流模式是基于滑動(dòng)時(shí)間窗口算法
- 排隊(duì)等待的限流模式則基于漏桶算法
- 而熱點(diǎn)參數(shù)限流則是基于令牌桶算法
到了這里,關(guān)于【Sentinel】Sentinel與gateway的限流算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!