更新時間:2019-09-24 09:48:13 來源:動力節(jié)點 瀏覽2647次
大部分時候,一個系統(tǒng)的能力是有限的,一些對外提供的接口需要做限流控制,不然在請求突增的時候,會導致系統(tǒng)直接崩潰;所以當流量請求超過規(guī)定的數(shù)值,我們就要對請求進行引流或拒絕。
說到限流,那就要提到限流算法,常用的有【漏桶算法】和【令牌桶算法】兩種限流算法。
漏桶算法
漏桶算法,顧名思義,漏桶可以儲水,只有一個固定大小的出口;漏桶算法中,可以把一個隊列看做是漏斗,如果隊列(漏桶)滿了,那么數(shù)據(jù)包(水)就被被丟棄。漏桶算法可以控制數(shù)量的輸出速度,平滑突發(fā)流量,最終實現(xiàn)“提供穩(wěn)定的輸出”。
令牌桶算法
如果把漏斗算法是看做是限制出水的速度,那么令牌通算法就是在進水的時候就做了限制。
令牌通算法的原理,是以一個恒定的速度往桶里放入請求,如果請求需要被處理,則需要先獲得一個令牌,當桶里沒有令牌可取的時候,則拒絕繼續(xù)放入請求。
Guava包中的RateLimiter,是令牌桶算法的解決方案之一,Google出品,用起來非常的簡單,推薦看看源碼。
動態(tài)使用漏桶算法和令牌桶算法
我們曾經(jīng)有個項目用到了令牌桶算法,就是使用的Guava包中的RateLimiter,但是我們增加了一些改進:
令牌桶中令牌的數(shù)量,初始設置一個較低的值,比如10,表示每秒最多發(fā)送10次請求。
監(jiān)控對方應用的資源使用情況。
當對方應用CPU/內(nèi)存等數(shù)值,處在一個較低的值時,動態(tài)增加令牌數(shù)量。(監(jiān)控程序調(diào)用系統(tǒng)的一個接口,修改令牌的數(shù)量為當前的兩倍,即10個變成20個)
當對方應用CPU/內(nèi)存等數(shù)值,處在一個較高的值時,動態(tài)降低令牌的數(shù)量。
以上就是動力節(jié)點java培訓機構(gòu)小編介紹的“Java算法學習教程-帶你了解限流算法”的內(nèi)容,希望對大家有幫助,更多java最新資訊請繼續(xù)關(guān)注動力節(jié)點java培訓機構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。