限流算法

1叽奥、漏桶限流算法

漏桶限流算法是一種常見的限流算法鉴裹,它的基本思想是模擬一個漏桶來控制流量。這個漏桶可以看作一個固定容量的桶廷没,所有的請求都先進(jìn)入到這個桶里糊饱,然后按照一定的速率流出,如果請求進(jìn)來的速度過快颠黎,超過了桶的容量另锋,那么多余的請求就會被直接丟棄或者排隊(duì)等待處理。

漏桶限流算法的實(shí)現(xiàn)方式也很簡單狭归,大致可以分為以下幾個步驟:

初始化一個固定容量的漏桶夭坪,并設(shè)置流出速率。
當(dāng)有請求進(jìn)來時过椎,先將其放入漏桶中室梅。
如果漏桶還有剩余容量,那么這個請求就可以被處理潭流,同時從漏桶中流出一個請求竞惋。
如果漏桶已經(jīng)滿了,那么這個請求就被丟棄或者排隊(duì)等待處理灰嫉。
在實(shí)際編程中,我們可以使用一個定時任務(wù)來模擬漏桶的流出速率嗓奢,每次定時任務(wù)執(zhí)行時讼撒,從漏桶中流出一個請求進(jìn)行處理。

以下是一個簡單的Java實(shí)現(xiàn)漏桶限流算法的示例代碼:

public class LeakyBucket {
    private final int capacity;  // 漏桶容量
    private final int rate;      // 流出速率股耽,單位為請求數(shù)/秒
    private int water;           // 當(dāng)前水量
    private long timestamp;      // 上次流出時間

    public LeakyBucket(int capacity, int rate) {
        this.capacity = capacity;
        this.rate = rate;
        this.water = 0;
        this.timestamp = System.currentTimeMillis();
    }

    public boolean allowRequest() {
        // 先計算當(dāng)前漏桶中的水量
        long now = System.currentTimeMillis();
        int out = (int) ((now - timestamp) / 1000 * rate);
        water = Math.max(0, water - out);

        // 檢查漏桶是否已經(jīng)滿了
        if (water >= capacity) {
            return false;  // 漏桶已滿根盒,拒絕請求
        }

        // 漏桶還有剩余容量,將請求放入漏桶中物蝙,并更新時間戳和水量
        timestamp = now;
        water++;
        return true;
    }
}

在上面的代碼中炎滞,LeakyBucket類表示一個漏桶限流器,它包含漏桶的容量诬乞、流出速率册赛、當(dāng)前水量以及上次流出時間等屬性钠导。allowRequest方法用于處理請求,如果漏桶還有剩余容量森瘪,那么這個請求就可以被處理牡属,同時從漏桶中流出一個請求。否則扼睬,漏桶已滿逮栅,拒絕請求。

2窗宇、滑動窗口限流算法

滑動窗口限流算法是一種常見的限流算法措伐,用于控制請求流量,防止系統(tǒng)被過多的請求壓垮军俊。

該算法的基本思想是侥加,將時間劃分成固定大小的多個時間段,每個時間段稱為一個桶蝇完,將請求分配到不同的桶中官硝。如果某個桶中的請求數(shù)量超過了閾值,就拒絕該桶中多余的請求短蜕。

具體實(shí)現(xiàn)中氢架,我們可以使用一個固定大小的隊(duì)列來表示滑動窗口,隊(duì)列中的每個元素表示一個時間段對應(yīng)的桶朋魔。每當(dāng)有請求到來時岖研,就將其放入當(dāng)前時間段對應(yīng)的桶中,并計算當(dāng)前滑動窗口中所有桶的請求數(shù)量警检。如果總請求數(shù)量超過了閾值孙援,就拒絕該請求。同時扇雕,我們需要定期移除隊(duì)列中最老的元素拓售,以保證滑動窗口能夠不斷向前移動。

滑動窗口限流算法簡單易懂镶奉,適用于大多數(shù)場景础淤,但需要根據(jù)具體業(yè)務(wù)場景調(diào)整桶的大小和閾值的設(shè)定,以達(dá)到最佳的限流效果哨苛。

import java.util.LinkedList;
import java.util.Queue;

public class SlidingWindowRateLimiter {
    private Queue<Long> window;
    private final int limit;
    private final long windowSize;

    public SlidingWindowRateLimiter(int limit, long windowSize) {
        this.window = new LinkedList<>();
        this.limit = limit;
        this.windowSize = windowSize;
    }

    public synchronized boolean tryAcquire() {
        long now = System.currentTimeMillis();
        if (window.size() >= limit) {
            long oldest = window.peek();
            if (now - oldest < windowSize) {
                return false; // Reject request
            }
            window.poll();
        }
        window.offer(now);
        return true; // Accept request
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸽凶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子建峭,更是在濱河造成了極大的恐慌玻侥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿蒸,死亡現(xiàn)場離奇詭異凑兰,居然都是意外死亡掌桩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門票摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拘鞋,“玉大人,你說我怎么就攤上這事矢门∨枭” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵祟剔,是天一觀的道長隔躲。 經(jīng)常有香客問我,道長物延,這世上最難降的妖魔是什么宣旱? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮叛薯,結(jié)果婚禮上浑吟,老公的妹妹穿的比我還像新娘。我一直安慰自己耗溜,他們只是感情好组力,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抖拴,像睡著了一般燎字。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阿宅,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天候衍,我揣著相機(jī)與錄音,去河邊找鬼洒放。 笑死蛉鹿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的往湿。 我是一名探鬼主播榨为,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼煌茴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起日川,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蔓腐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后龄句,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體回论,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡散罕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了傀蓉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧漱。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葬燎,靈堂內(nèi)的尸體忽然破棺而出误甚,到底是詐尸還是另有隱情,我是刑警寧澤谱净,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布窑邦,位于F島的核電站,受9級特大地震影響壕探,放射性物質(zhì)發(fā)生泄漏冈钦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一李请、第九天 我趴在偏房一處隱蔽的房頂上張望瞧筛。 院中可真熱鬧,春花似錦导盅、人聲如沸较幌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绅络。三九已至,卻和暖如春嘁字,著一層夾襖步出監(jiān)牢的瞬間恩急,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工纪蜒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衷恭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓纯续,卻偏偏與公主長得像随珠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猬错,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354