面試題出發(fā)
怎么解決緩存出現(xiàn)雪崩撵枢?
- 更新策略在時(shí)間上做到比較均勻
- 熱數(shù)據(jù)盡量分散到不同的機(jī)器上
- 多臺(tái)機(jī)器主從復(fù)制或者多副本,實(shí)現(xiàn)高可用
- 實(shí)現(xiàn)熔斷限流機(jī)制根资,對(duì)系統(tǒng)進(jìn)行負(fù)載能力控制
發(fā)現(xiàn)前三者都是基本在機(jī)器數(shù)量上增加胎撇,最后則不同狸捕,是利用熔斷限流機(jī)制热幔,進(jìn)行負(fù)載能力的控制乐设。
限流實(shí)現(xiàn)方式有哪些
- 計(jì)數(shù)器方式
最簡(jiǎn)單的限流算法就是維護(hù)一個(gè)計(jì)數(shù)器 Counter,當(dāng)一個(gè)請(qǐng)求來時(shí)绎巨,就做加一操作近尚,當(dāng)一個(gè)請(qǐng)求處理完后就做減一操作。如果這個(gè) Counter 大于某個(gè)數(shù)了(我們?cè)O(shè)定的限流閾值)场勤,那么就開始拒絕請(qǐng)求以保護(hù)系統(tǒng)的負(fù)載了戈锻。
- 隊(duì)列算法
隊(duì)列流控是以隊(duì)列的的方式來處理請(qǐng)求。如果處理過慢和媳,那么就會(huì)導(dǎo)致隊(duì)列滿舶沛,而開始觸發(fā)限流。這樣的算法需要用隊(duì)列長(zhǎng)度來控制流量窗价,在配置上比較難操作。如果隊(duì)列過長(zhǎng)叹卷,導(dǎo)致后端服務(wù)在隊(duì)列沒有滿時(shí)就掛掉了撼港。
-
漏斗算法
-
漏斗算法其實(shí)就是在隊(duì)列請(qǐng)求中加上一個(gè)限流器,來讓 Processor 以一個(gè)均勻的速度處理請(qǐng)求
-
令牌桶算法
-
從理論上來說骤竹,令牌桶的算法和漏斗算法不一樣的是帝牡,漏斗算法中,處理請(qǐng)求是以一個(gè)常量和恒定的速度處理的蒙揣,而令牌桶算法則是在流量小的時(shí)候“攢錢”靶溜,流量大的時(shí)候,可以快速處理。
- 基于相應(yīng)時(shí)間的動(dòng)態(tài)限流
這方面設(shè)計(jì)的典范是 TCP 協(xié)議的擁塞控制的算法罩息。TCP 使用 RTT - Round Trip Time 來探測(cè)網(wǎng)絡(luò)的延時(shí)和性能嗤详,從而設(shè)定相應(yīng)的“滑動(dòng)窗口”的大小,以讓發(fā)送的速率和網(wǎng)絡(luò)的性能相匹配瓷炮。
- 基于相應(yīng)時(shí)間的動(dòng)態(tài)限流
Soul 上的解決方案
上面兩道面試題都提到了熔斷限流葱色,那 Soul 上又是如何實(shí)現(xiàn)限流熔斷機(jī)制的呢?
rateLimiter 插件
利用 Redis 令牌桶算法進(jìn)行限流娘香。和 Guava RateLimiter 的名字類似苍狰,但兩者不一樣。
Hystrix 插件
hystrix 插件是網(wǎng)關(guān)用來對(duì)流量進(jìn)行熔斷的核心實(shí)現(xiàn)烘绽。
使用信號(hào)量的方式來處理請(qǐng)求淋昭,基于 Netflix/Hystrix 來實(shí)現(xiàn)的。
Sentinel 插件
sentinel 為網(wǎng)關(guān)熔斷限流提供能力安接。
resilience4j 插件
resilience4j 為網(wǎng)關(guān)熔斷限流提供能力翔忽。
上述四個(gè)插件便是 Soul 上用于解決限流熔斷機(jī)制。
參考文獻(xiàn)
彈力設(shè)計(jì)篇之“限流設(shè)計(jì)”
超詳細(xì)的Guava RateLimiter限流原理解析