秒殺系統(tǒng)之二:接口限流(令牌桶和漏斗算法)

3. 接口限流

限流:是對某一時間窗口內(nèi)的請求數(shù)進(jìn)行限制摊灭,保持系統(tǒng)的可用性和穩(wěn)定性怕轿,防止因流量暴增而導(dǎo)致的系統(tǒng)運(yùn)行緩慢或宕機(jī)

3.1 接口限流

在面臨高并發(fā)的搶購請求時偷崩,我們?nèi)绻粚涌谶M(jìn)行限流,可能會對后臺系統(tǒng)造成極大的壓力撞羽。大量的請求搶購成功時需要調(diào)用下單的接口阐斜,過多的請求打到數(shù)據(jù)庫會對系統(tǒng)的穩(wěn)定性造成影響。

3.2 如何解決接口限流

常用的限流算法有令牌桶和和漏桶(漏斗算法)诀紊,而Google開源項目Guava中的RateLimiter使用的就是令牌桶控制算法谒出。在開發(fā)高并發(fā)系統(tǒng)時有三把利器用來保護(hù)系統(tǒng):緩存降級限流

  • 緩存:緩存的目的是提升系統(tǒng)訪問速度和增大系統(tǒng)處理容量
  • 降級:降級是當(dāng)服務(wù)器壓力劇增的情況下邻奠,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對一些服務(wù)和頁面有策略的降級笤喳,以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行
  • 限流:限流的目的是通過對并發(fā)訪問/請求進(jìn)行限速,或者對一個時間窗口內(nèi)的請求進(jìn)行限速來保護(hù)系統(tǒng)碌宴,一旦達(dá)到限制速率則可以拒絕服務(wù)杀狡、排隊或等待、降級等處理贰镣。

3.3 令牌桶和漏斗算法

image-20200401091230233.png
  • 漏斗算法:漏桶算法思路很簡單捣卤,水(請求)先進(jìn)入到漏桶里忍抽,漏桶以一定的速度出水,當(dāng)水流入速度過大會直接溢出董朝,可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率鸠项。
  • 令牌桶算法:最初來源于計算機(jī)網(wǎng)絡(luò)。在網(wǎng)絡(luò)傳輸數(shù)據(jù)時子姜,為了防止網(wǎng)絡(luò)擁塞祟绊,需限制流出網(wǎng)絡(luò)的流量,使流量以比較均勻的速度向外發(fā)送哥捕。令牌桶算法就實現(xiàn)了這個功能牧抽,可控制發(fā)送到網(wǎng)絡(luò)上數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送遥赚。大小固定的令牌桶可自行以恒定的速率源源不斷地產(chǎn)生令牌扬舒。如果令牌不被消耗,或者被消耗的速度小于產(chǎn)生的速度凫佛,令牌就會不斷地增多讲坎,直到把桶填滿。后面再產(chǎn)生的令牌就會從桶中溢出愧薛。最后桶中可以保存的最大令牌數(shù)永遠(yuǎn)不會超過桶的大小晨炕。這意味,面對瞬時大流量毫炉,該算法可以在短時間內(nèi)請求拿到大量令牌瓮栗,而且拿令牌的過程并不是消耗很大的事情。

3.4 令牌桶簡單使用

1. 項目中引入依賴
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>
2. 令牌桶算法的基本使用
public class StockController {
    @Autowired
    private OrderService orderService;

    //創(chuàng)建令牌桶實例
    private RateLimiter rateLimiter =  RateLimiter.create(40);

    @GetMapping("sale")
    public String sale(Integer id){
        //1.沒有獲取到token請求一直知道獲取到token 令牌
        //log.info("等待的時間: "+  rateLimiter.acquire());

        //2.設(shè)置一個等待時間,如果在等待的時間內(nèi)獲取到了token 令牌,則處理業(yè)務(wù),如果在等待時間內(nèi)沒有獲取到響應(yīng)token則拋棄
        if(!rateLimiter.tryAcquire(2, TimeUnit.SECONDS)){
            System.out.println("當(dāng)前請求被限流,直接拋棄,無法調(diào)用后續(xù)秒殺邏輯....");
            return "搶購失敗!";
        }
        System.out.println("處理業(yè)務(wù).....................");
        return "搶購成功";
    }
}

3.5使用令牌桶算法實現(xiàn)樂觀鎖+限流

1. 使用令牌桶改造controller實現(xiàn)樂觀鎖+限流
 //開發(fā)一個秒殺方法 樂觀鎖防止超賣+ 令牌桶算法限流
    @GetMapping("killtoken")
    public String killtoken(Integer id){
        System.out.println("秒殺商品的id = " + id);
        //加入令牌桶的限流措施
        if(!rateLimiter.tryAcquire(3, TimeUnit.SECONDS)){
            log.info("拋棄請求: 搶購失敗,當(dāng)前秒殺活動過于火爆,請重試");
            return "搶購失敗,當(dāng)前秒殺活動過于火爆,請重試!";
        }
        try {
            //根據(jù)秒殺商品id 去調(diào)用秒殺業(yè)務(wù)
            int orderId = orderService.kill(id);
            return "秒殺成功,訂單id為: " + String.valueOf(orderId);
        }catch (Exception e){
            e.printStackTrace();
            return e.getMessage();
        }
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞄勾,一起剝皮案震驚了整個濱河市费奸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌进陡,老刑警劉巖货邓,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異四濒,居然都是意外死亡换况,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門盗蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戈二,“玉大人,你說我怎么就攤上這事喳资【蹩裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵仆邓,是天一觀的道長鲜滩。 經(jīng)常有香客問我伴鳖,道長,這世上最難降的妖魔是什么徙硅? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嗓蘑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桩皿。我一直安慰自己豌汇,他們只是感情好泄隔,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佛嬉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巷燥。 梳的紋絲不亂的頭發(fā)上赡盘,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天缰揪,我揣著相機(jī)與錄音,去河邊找鬼钝腺。 笑死,一個胖子當(dāng)著我的面吹牛赞厕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皿桑,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诲侮!你這毒婦竟也來了唉堪?” 一聲冷哼從身側(cè)響起误窖,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎前酿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年辈毯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搜贤。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谆沃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出入客,到底是詐尸還是另有隱情管毙,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布桌硫,位于F島的核電站夭咬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铆隘。R本人自食惡果不足惜卓舵,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膀钠。 院中可真熱鬧掏湾,春花似錦、人聲如沸肿嘲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雳窟。三九已至尊浪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間封救,已是汗流浹背拇涤。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留誉结,地道東北人鹅士。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像惩坑,于是被迫代替她去往敵國和親掉盅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348