java分布式面試系統(tǒng)限流最佳實(shí)踐
引言
前面講了系統(tǒng)中的降級(jí)熔斷設(shè)計(jì)和對(duì) Hystrix 組件的功能了解,關(guān)于限流降級(jí)還有一個(gè)比較重要的知識(shí)點(diǎn)就是限流算法。
如果你面試的是電商相關(guān)公司,這一塊就顯得更加重要了,秒殺、搶購(gòu)等場(chǎng)景,需有一種手段來(lái)限制這些場(chǎng)景的并發(fā)/請(qǐng)求量,手段就是限流。
沒(méi)有配置限流,如果遇到上游系統(tǒng)頻繁調(diào)用,會(huì)導(dǎo)致下游系統(tǒng)被擊垮。
配置了限流,但是限流算法不合理,會(huì)導(dǎo)致正常訪(fǎng)問(wèn)被拒絕,所以限流算法不能亂用,要充分評(píng)估系統(tǒng)是否需要限流,如果要限流,流量大小如何評(píng)估。
1、面試官:
哪些場(chǎng)景系統(tǒng)使用了限流?為什么要使用限流?
問(wèn)題分析:這個(gè)問(wèn)題比較簡(jiǎn)單,所有訪(fǎng)問(wèn)頻繁的服務(wù)都可以做限流,相比公司內(nèi)部運(yùn)營(yíng)系統(tǒng),用戶(hù)加起來(lái)不過(guò)十幾個(gè),這種系統(tǒng)就沒(méi)必要限流了。
答:限流呀,無(wú)非就是秒殺活動(dòng),或者容易被爬蟲(chóng)爬的信息類(lèi)頁(yè)面,以及系統(tǒng)核心服務(wù),這些都需要做限流,比如大眾點(diǎn)評(píng)首頁(yè),因?yàn)橥扑]了一些高質(zhì)量店鋪信息,經(jīng)常被同行或者門(mén)戶(hù)類(lèi)公司的爬蟲(chóng)爬取信息,這個(gè)時(shí)候我們就要對(duì)首頁(yè)做限流操作。秒殺活動(dòng),系統(tǒng)核心高QPS服務(wù),都需要考慮限流。
使用限流的目的就是我們不能輕易被別人干倒,要7x24h保證服務(wù)正常,同時(shí),限流也是為了我們的下游系統(tǒng)不會(huì)輕易被我們拖垮,流量合理放行。
2、面試官:
那你了解哪些常用限流算法?
答:常用的限流算法就3種:
1.計(jì)數(shù)器方法:
固定時(shí)間窗口,比如1min/1h,設(shè)置一個(gè)計(jì)數(shù)器統(tǒng)計(jì)單位時(shí)間內(nèi)一個(gè)請(qǐng)求的訪(fǎng)問(wèn)量,超過(guò)計(jì)數(shù)器最大值,可以讓請(qǐng)求放入等待隊(duì)列 or 直接拒接訪(fǎng)問(wèn),這種方法簡(jiǎn)單粗暴,但是易造成突刺現(xiàn)象。
2.漏斗算法:
可以理解成一個(gè)固定容量的漏桶,不管流量多還是少,我都按照常量固定速率流出水滴,如果流入水滴超出了桶的容量,就讓水溢出。這種算法優(yōu)點(diǎn)是穩(wěn)定速率,缺點(diǎn)是無(wú)法面對(duì)突發(fā)流量。
3.令牌桶算法:
讓每次請(qǐng)求調(diào)用需要先獲取令牌,只有拿到令牌,才有機(jī)會(huì)繼續(xù)執(zhí)行,否則選擇等待可用的令牌,或者直接拒絕。優(yōu)點(diǎn)是系統(tǒng)發(fā)放令牌的速率是可變的,能夠面對(duì)突發(fā)流量,缺點(diǎn)是有點(diǎn)復(fù)雜。
具體使用哪種算法,要根據(jù)具體業(yè)務(wù)場(chǎng)景,比如系統(tǒng)時(shí)候會(huì)有突發(fā)流量,調(diào)用方重要程度等,如果調(diào)用方不是很重要,為了顧全大局,直接放調(diào)用方稍后重試。
3、面試官:
那具體這值該如何評(píng)估,說(shuō)到現(xiàn)在我還是不知道限流到底要怎么設(shè)置,可以給我一點(diǎn)經(jīng)驗(yàn)方法嗎?
(我繼續(xù)…)
對(duì)于核心服務(wù)限流的值可以通過(guò)以下方法來(lái)設(shè)置合理的值:
- 觀(guān)察評(píng)估法:系統(tǒng)總該有QPS監(jiān)控系統(tǒng)吧,看看流量環(huán)比最大值,最小值,平均值,這就是很好的參考,總不能我一拍腦袋設(shè)置一個(gè)250上去。
- 壓力測(cè)試法:找QA,半夜業(yè)務(wù)低峰期,看看系統(tǒng)能承受的最大QPS。
同時(shí),限流還有和重試、降級(jí)、熔斷等作為組合方法一起使用。
深入分析
于具體使用的技術(shù)和工具并不是重點(diǎn),還有人說(shuō)我也不用Guava,也不用Thread sleep,更不用Hystrix,我用Nginx,前系統(tǒng)最前端同樣可以做限流,方案可行,條條大路通羅馬。
使用線(xiàn)程池實(shí)現(xiàn):
@SpringBootTest @RunWith(SpringRunner.class) public class RejectTest { @Test public void testReject() { for (int i = 0; i < 25; ++i) { new Thread(() -> // do something )).start(); } // 防止主線(xiàn)程提前結(jié)束執(zhí)行 TimeUtils.sleep(50); } }
借助Guava實(shí)現(xiàn):
RateLimiter rateLimiter = RateLimiter.create(20.0); boolean token = rateLimiter.tryAcquire(); if (token) { System.out.println("pass"); } else { System.out.println("refuse"); }
總結(jié)
我認(rèn)為學(xué)習(xí)限流最重要的點(diǎn)是掌握解決問(wèn)題的思路,至于具體使用的技術(shù)和工具并不是重點(diǎn),還有人說(shuō)我也不用Guava,也不用Thread sleep,更不用Hystrix,我用Nginx,前系統(tǒng)最前端同樣可以做限流,方案可行,條條大路通羅馬。
以上就是java分布式面試系統(tǒng)限流最佳實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于分布式系統(tǒng)限流面試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java面向?qū)ο蠡A(chǔ)知識(shí)之抽象類(lèi)和接口
這篇文章主要介紹了Java面向?qū)ο蟮某橄箢?lèi)和接口,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11java GUI編程之布局控制器(Layout)實(shí)例分析
這篇文章主要介紹了java GUI編程之布局控制器(Layout),結(jié)合實(shí)例形式分析了java GUI編程中布局控制器(Layout)具體功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-01-01java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程
最近在java連接SQL數(shù)據(jù)庫(kù)時(shí)會(huì)出現(xiàn)一些問(wèn)題,所以這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06詳解Java子線(xiàn)程異常時(shí)主線(xiàn)程事務(wù)如何回滾
如果主線(xiàn)程向線(xiàn)程池提交了一個(gè)任務(wù),如果執(zhí)行這個(gè)任務(wù)過(guò)程中發(fā)生了異常,如何讓主線(xiàn)程捕獲到該異常并且進(jìn)行事務(wù)的回滾?本篇文章帶給你答案2022-03-03springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例
這篇文章主要介紹了springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下2020-09-09解決本機(jī)安裝的JDK8,啟動(dòng)IDEA2019沒(méi)反應(yīng)的問(wèn)題(開(kāi)發(fā)工具)
這篇文章主要介紹了解決本機(jī)安裝的JDK8啟動(dòng)IDEA2019沒(méi)反應(yīng)的問(wèn)題(開(kāi)發(fā)工具),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10springboot如何使用thymeleaf模板訪(fǎng)問(wèn)html頁(yè)面
springboot中推薦使用thymeleaf模板,使用html作為頁(yè)面展示。那么如何通過(guò)Controller來(lái)訪(fǎng)問(wèn)來(lái)訪(fǎng)問(wèn)html頁(yè)面呢?下面通過(guò)本文給大家詳細(xì)介紹,感興趣的朋友跟隨腳本之家小編一起看看吧2018-05-05