Sentinel勻速模式(削峰填谷)

一肝断、什么是削峰填谷:

某瞬時來了大流量的請求, 而如果此時要處理所有請求杈曲,很可能會導(dǎo)致系統(tǒng)負(fù)載過高,影響穩(wěn)定性胸懈。但其實(shí)可能后面幾秒之內(nèi)都沒有消息投遞鱼蝉,若直接把多余的消息丟掉則沒有充分利用系統(tǒng)處理消息的能力。Sentinel的Rate Limiter模式能在某一段時間間隔內(nèi)以勻速方式處理這樣的請求, 充分利用系統(tǒng)的處理能力, 也就是削峰填谷, 保證資源的穩(wěn)定性.
Sentinel會以固定的間隔時間讓請求通過, 訪問資源箫荡。當(dāng)請求到來的時候,如果當(dāng)前請求距離上個通過的請求通過的時間間隔不小于預(yù)設(shè)值渔隶,則讓當(dāng)前請求通過羔挡;否則洁奈,計(jì)算當(dāng)前請求的預(yù)期通過時間,如果該請求的預(yù)期通過時間小于規(guī)則預(yù)設(shè)的 timeout 時間绞灼,則該請求會等待直到預(yù)設(shè)時間到來通過利术;反之,則馬上拋出阻塞異常低矮。
使用Sentinel的這種策略, 簡單點(diǎn)說, 就是使用一個時間段(比如20s的時間)處理某一瞬時產(chǎn)生的大量請求, 起到一個削峰填谷的作用, 從而充分利用系統(tǒng)的處理能力, 下圖能很形象的展示這種場景: X軸代表時間, Y軸代表系統(tǒng)處理的請求.

image.png

二印叁、驗(yàn)證

模擬1000個請求同時并發(fā)的訪問資源, 這1000個請求, 如果設(shè)置QPS閾值為100, 按照默認(rèn)sentinel默認(rèn)的RuleConstant.CONTROL_BEHAVIOR_DEFAULT拒絕策略, 那么剩余的900個請求會被立即直接拒絕掉, 拋出BlockException.

image.png
image.png
image.png

同樣是模擬1000個請求同時并發(fā)訪問資源, 同樣設(shè)置QPS閾值100, 但是拒絕策略修改為Rate Limiter勻速RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER方式, 還需要設(shè)置setMaxQueueingTimeMs(20 * 1000)表示每一請求最長等待時間, 這里等待時間大一點(diǎn), 以保證讓所有請求都能正常通過。
假設(shè)這里設(shè)置的排隊(duì)等待時間過小的話, 導(dǎo)致排隊(duì)等待的請求超時而拋出異常BlockException, 最終結(jié)果可能是這1000個并發(fā)請求中只有幾個請求或幾十個才能正常通過, 所以使用這種模式得根據(jù)訪問資源的耗時時間決定排隊(duì)等待時間军掂。
按照目前這種設(shè)置, QPS閾值為100的話, 每一個請求相當(dāng)于是以勻速10ms左右通過轮蜕。

@GetMapping("/paceFlow")
    public void paceFlow() throws InterruptedException{
        System.out.println("pace behavior");
        countDown = new CountDownLatch(1);
        // queuing隊(duì)列方式, 勻速處理流量
        initPaceFlowRule();
        // 直接并發(fā)同時啟動1000個線程, 模擬1000個并發(fā)請求資源
        simulatePulseFlow();
        countDown.await();

        System.out.println("done");
        System.out.println("total pass:" + pass.get() + ", total block:" + block.get());

        System.out.println();
    }

勻速模式的規(guī)則

private static void initPaceFlowRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource(KEY);
        rule1.setCount(count);
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule1.setLimitApp("default");
        /*
         * CONTROL_BEHAVIOR_RATE_LIMITER means requests more than threshold will be queueing in the queue, until the
         * queueing time is more than {@link FlowRule#maxQueueingTimeMs}, the requests will be rejected.
         */
        rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
        // 這里設(shè)置的等待處理時間較大, 讓系統(tǒng)能平穩(wěn)的處理所有的請求
        rule1.setMaxQueueingTimeMs(20 * 1000);// 表示每一個請求的最長等待時間20s
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
    }

并發(fā)啟動1000線程模擬請求

private static void simulatePulseFlow() {
        for (int i = 0; i < requestQps; i++) {
            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    long startTime = TimeUtil.currentTimeMillis();
                    Entry entry = null;
                    try {
                        entry = SphU.entry(KEY);
                        pass.incrementAndGet();
                    } catch (BlockException e1) {
                        System.out.println("===>BlockException");
                        block.incrementAndGet();
                    } catch (Exception e2) {
                        // biz exception
                    } finally {
                        if (entry != null) {
                            entry.exit();
                            // pass.incrementAndGet();
                            long cost = TimeUtil.currentTimeMillis() - startTime;
                            System.out.println(TimeUtil.currentTimeMillis() + " one request pass, cost " + cost
                                    + " ms");
                        }
                    }

                    try {
                        TimeUnit.MILLISECONDS.sleep(5);
                    } catch (InterruptedException e1) {
                        // ignore
                    }

                    if (done.incrementAndGet() >= requestQps) {
                        countDown.countDown();
                    }
                }
            }, "Thread " + i);
            thread.start();
        }
    }

啟動后控制臺打印:

image.png

可以看到pass:1000蝗锥,block:0跃洛,可以看到在闊值設(shè)定為100,勻速模式下仍可以全部通過终议,實(shí)現(xiàn)了削峰填谷汇竭。
sentinel控制臺展示效果圖:

image.png

可以看到由于闊值是100,而模擬請求是1000穴张,通過的qps就是100细燎,勻速通過直到全部pass。
還可以在控制臺看到代碼所限定的流控規(guī)則:

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皂甘,一起剝皮案震驚了整個濱河市玻驻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叮贩,老刑警劉巖击狮,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異益老,居然都是意外死亡彪蓬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門捺萌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來档冬,“玉大人,你說我怎么就攤上這事桃纯】崾模” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵态坦,是天一觀的道長盐数。 經(jīng)常有香客問我,道長伞梯,這世上最難降的妖魔是什么玫氢? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任帚屉,我火速辦了婚禮,結(jié)果婚禮上漾峡,老公的妹妹穿的比我還像新娘攻旦。我一直安慰自己,他們只是感情好生逸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布牢屋。 她就那樣靜靜地躺著,像睡著了一般槽袄。 火紅的嫁衣襯著肌膚如雪烙无。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天掰伸,我揣著相機(jī)與錄音皱炉,去河邊找鬼。 笑死狮鸭,一個胖子當(dāng)著我的面吹牛合搅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歧蕉,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼灾部,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惯退?” 一聲冷哼從身側(cè)響起赌髓,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎催跪,沒想到半個月后锁蠕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懊蒸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年荣倾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骑丸。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡舌仍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出通危,到底是詐尸還是另有隱情铸豁,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布菊碟,位于F島的核電站节芥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逆害。R本人自食惡果不足惜藏古,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一增炭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拧晕,春花似錦、人聲如沸梅垄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽队丝。三九已至靡馁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間机久,已是汗流浹背臭墨。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膘盖,地道東北人胧弛。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像侠畔,于是被迫代替她去往敵國和親结缚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345