如何保證在流量瞬時(shí)突增的情況下保證系統(tǒng)的穩(wěn)定性

第一層:合法性限流

首先對(duì)于合法性要有一個(gè)認(rèn)識(shí)咒锻,哪些行為是合法的豁翎,哪些是非法的蝴猪,比如:用戶反復(fù)購買同一件商品行為(刷單)漓摩,或者是機(jī)器人參與秒殺

1.驗(yàn)證碼

? 針對(duì)不同的非法請(qǐng)求要用不同的方法來限制裙士,對(duì)于機(jī)器人,首先想到的應(yīng)該是增加驗(yàn)證碼功能管毙,驗(yàn)證碼還能使用戶的下單時(shí)長(zhǎng)增加腿椎,比如:原來的下單時(shí)長(zhǎng)是1秒,在增加驗(yàn)證碼之后夭咬,用戶的下單時(shí)間可能就會(huì)在1-3秒之間啃炸,這樣原來一秒鐘需要處理100萬請(qǐng)求,現(xiàn)在每秒就需要處理33萬卓舵,可以降低流量的峰值

2.IP黑名單

? 通過網(wǎng)絡(luò)監(jiān)控技術(shù)獲取到某個(gè)IP請(qǐng)求服務(wù)的時(shí)間是毫秒級(jí)別或者南用,多次下單同一個(gè)商品,那么這個(gè)IP很有可能就是機(jī)器人或者刷單行為掏湾,這樣就可以把這個(gè)IP加入黑名單中來減少不合法的請(qǐng)求

3.隱藏入口地址

? 比如:在秒殺開始之后才能打開秒殺頁面等

第二層:負(fù)載限流

理論基礎(chǔ):網(wǎng)絡(luò)七層模型

? 1)物理層:物理層
? 2)數(shù)據(jù)鏈路層:提供介質(zhì)訪問和鏈路管理
? 3)網(wǎng)絡(luò)層:IP選址和路由選擇
? 4)傳輸層:建立裹虫、管理和維護(hù)端到端的連接
? 5)會(huì)話層:建立、管理和維護(hù)對(duì)話
? 6)表示層:數(shù)據(jù)格式轉(zhuǎn)化和數(shù)據(jù)加密
? 7)應(yīng)用層:為應(yīng)用程序提供服務(wù)

方法:

? 1.通過Nginx進(jìn)行負(fù)載均衡融击,如果有3臺(tái)服務(wù)器筑公,那么每臺(tái)服務(wù)器就會(huì)承載三分之一的請(qǐng)求

? 2.在數(shù)據(jù)鏈路層,通過MAC地址進(jìn)行負(fù)載;在網(wǎng)絡(luò)層尊浪,通過IP進(jìn)行負(fù)載匣屡,在傳輸層封救,通過端口號(hào)進(jìn)行負(fù)載

? 3.級(jí)聯(lián)負(fù)載:也就是在第二層->第三層->第四層->第七層都進(jìn)行負(fù)載,但是這種方法不推薦捣作,因?yàn)槊窟M(jìn)行一次負(fù)載都會(huì)增加轉(zhuǎn)發(fā)路徑誉结,這樣會(huì)帶來網(wǎng)絡(luò)延遲的問題

注意:所以常見的負(fù)載限流是通過Nginx(應(yīng)用層)或者 Nginx+LVS(傳輸層,通過網(wǎng)絡(luò)端口進(jìn)行負(fù)載)來進(jìn)行負(fù)載虾宇,或者通過購買F5或者Array等硬件工具來進(jìn)行負(fù)載

第三層:服務(wù)限流(請(qǐng)求已經(jīng)抵達(dá)服務(wù)器)

方法:

? 1.通過算法來進(jìn)行限流:如漏桶算法和令牌桶算法(php可以配合redis來實(shí)現(xiàn))

? 漏桶算法理解:水(請(qǐng)求)先進(jìn)入到漏桶里,漏桶以一定的速度出水(接口有響應(yīng)速率),當(dāng)水流入速度過大會(huì)直接溢出(訪問頻率超過接口響應(yīng)速率),然后就拒絕請(qǐng)求,可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率搓彻。

? 令牌桶算法理解:是和漏桶算法一樣但是方向相反的算法,設(shè)置一個(gè)桶的大小,每隔一定時(shí)間往桶里加入一個(gè)token(如10ms)嘱朽,桶滿了就不加了旭贬,每一個(gè)請(qǐng)求過來從桶里取一個(gè)token,如果沒有Token可拿了就阻塞或者拒絕服務(wù)

代碼示例:

<?php
namespace Api\Lib;

/**
 * 限流控制
 */
class RateLimit
{
    private $minNum = 60; //單個(gè)用戶每分訪問數(shù)
    private $dayNum = 10000; //單個(gè)用戶每天總的訪問量

    public function minLimit($uid)
    {
        $minNumKey = $uid . '_minNum';
        $dayNumKey = $uid . '_dayNum';
        $resMin    = $this->getRedis($minNumKey, $this->minNum, 60);
        $resDay    = $this->getRedis($minNumKey, $this->minNum, 86400);
        if (!$resMin['status'] || !$resDay['status']) {
            exit($resMin['msg'] . $resDay['msg']);
        }
    }

    public function getRedis($key, $initNum, $expire)
    {
        $nowtime  = time();
        $result   = ['status' => true, 'msg' => ''];
        $redisObj = $this->di->get('redis');
        $redis->watch($key);
        $limitVal = $redis->get($key);
        if ($limitVal) {
            $limitVal = json_decode($limitVal, true);
            $newNum   = min($initNum, ($limitVal['num'] - 1) + (($initNum / $expire) * ($nowtime - $limitVal['time'])));
            if ($newNum > 0) {
                $redisVal = json_encode(['num' => $newNum, 'time' => time()]);
            } else {
                return ['status' => false, 'msg' => '當(dāng)前時(shí)刻令牌消耗完搪泳!'];
            }
        } else {
            $redisVal = json_encode(['num' => $initNum, 'time' => time()]);
        }
        $redis->multi();
        $redis->set($key, $redisVal);
        $rob_result = $redis->exec();
        if (!$rob_result) {
            $result = ['status' => false, 'msg' => '訪問頻次過多稀轨!'];
        }
        return $result;
    }
}

2.通過消息隊(duì)列來進(jìn)行限流:

? 如:有三個(gè)子系統(tǒng)每秒分別能處理2萬,3萬岸军,5萬請(qǐng)求奋刽,如果不用消息隊(duì)列,那么每隔子系統(tǒng)就要處理3.3萬個(gè)請(qǐng)求艰赞,前兩個(gè)系統(tǒng)就會(huì)出現(xiàn)問題佣谐,如果使用消息隊(duì)列,那么這三個(gè)系統(tǒng)就可以針對(duì)自己的能力去消息隊(duì)列中拉取特定數(shù)量的請(qǐng)求進(jìn)行處理

3.緩存策略:

? 靜態(tài)緩存:如html和js代碼可以緩存到瀏覽器中方妖,如果是圖片的話可以緩存到nginx中或者通過nginx轉(zhuǎn)發(fā)到OSS中

? 動(dòng)態(tài)緩存:可以緩存的本地服務(wù)器中狭魂,如果本地緩存失效,可以緩存到遠(yuǎn)程的redis集群中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末党觅,一起剝皮案震驚了整個(gè)濱河市雌澄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杯瞻,老刑警劉巖镐牺,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異魁莉,居然都是意外死亡睬涧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門旗唁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畦浓,“玉大人,你說我怎么就攤上這事逆皮。” “怎么了参袱?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵电谣,是天一觀的道長(zhǎng)秽梅。 經(jīng)常有香客問我,道長(zhǎng)剿牺,這世上最難降的妖魔是什么企垦? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮晒来,結(jié)果婚禮上钞诡,老公的妹妹穿的比我還像新娘。我一直安慰自己湃崩,他們只是感情好荧降,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著攒读,像睡著了一般朵诫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薄扁,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天剪返,我揣著相機(jī)與錄音,去河邊找鬼邓梅。 笑死脱盲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的日缨。 我是一名探鬼主播钱反,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼殿遂!你這毒婦竟也來了诈铛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤墨礁,失蹤者是張志新(化名)和其女友劉穎幢竹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩静,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焕毫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驶乾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑飒。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖级乐,靈堂內(nèi)的尸體忽然破棺而出疙咸,到底是詐尸還是另有隱情,我是刑警寧澤风科,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布撒轮,位于F島的核電站乞旦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏题山。R本人自食惡果不足惜兰粉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顶瞳。 院中可真熱鬧玖姑,春花似錦、人聲如沸慨菱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡柿。三九已至舔琅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洲劣,已是汗流浹背备蚓。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囱稽,地道東北人郊尝。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像战惊,于是被迫代替她去往敵國(guó)和親流昏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容