摘要:視頻介紹令牌桶,分析令牌桶原理和代碼實(shí)現(xiàn)你好,我是好剛,這一講我們來(lái)了解令牌桶。總結(jié)下令牌桶算法的特點(diǎn),令牌桶即可以控制進(jìn)入系統(tǒng)的請(qǐng)求請(qǐng)求量,同時(shí)允許突發(fā)流量。
視頻介紹令牌桶,分析令牌桶原理和代碼實(shí)現(xiàn)
https://www.bilibili.com/vide...
你好,我是好剛,這一講我們來(lái)了解令牌桶(Token Bucket)。
先想象有一個(gè)木桶,系統(tǒng)按照固定速率,例如10ms 每次,往桶里加入Token,如果桶已經(jīng)滿了就不再添加。新請(qǐng)求來(lái)臨時(shí),會(huì)各自拿走一個(gè)Token,如果沒(méi)有Token 就拒絕服務(wù)。這里如果一段時(shí)間沒(méi)有請(qǐng)求時(shí),桶內(nèi)就會(huì)積累一些token,下次一旦有突發(fā)流量,只要token 足夠,也能一次處理。
總結(jié)下令牌桶算法的特點(diǎn),令牌桶即可以控制進(jìn)入系統(tǒng)的請(qǐng)求請(qǐng)求量,同時(shí)允許突發(fā)流量。
在秒殺活動(dòng)中,用戶的請(qǐng)求速率是不固定的,這里我們假定為10r/s,令牌按照5個(gè)每秒的速率放入令牌桶,桶中最多存放20個(gè)令牌,那系統(tǒng)就只會(huì)允許持續(xù)的每秒處理5 個(gè)請(qǐng)求,或者每隔4 秒,等桶中20 個(gè)令牌攢滿后,一次處理20個(gè)請(qǐng)求的突發(fā)情況,保證系統(tǒng)穩(wěn)定性。
偽代碼實(shí)現(xiàn):
rate = 5.0; // unit: messages per = 8.0; // unit: seconds allowance = rate; // unit: messages last_check = now(); // floating-point, e.g. usec accuracy. Unit: seconds when (message_received): current = now(); time_passed = current - last_check; last_check = current; allowance += time_passed * (rate / per); if (allowance > rate): allowance = rate; // throttle if (allowance < 1.0): discard_message(); else: forward_message(); allowance -= 1.0;令牌通算法PHP 實(shí)現(xiàn)
//速度 桶大小 / 時(shí)間段 $rate = $maxRequests / $period; $t_key = $keyTime($id); //最后一次獲取令牌時(shí)間 $a_key = $keyAllow($id); //已有令牌數(shù) //判斷是否有最后一次獲取令牌記錄 if ($cache->exists($t_key)) { $c_time = time(); //計(jì)算上一次獲取令牌到現(xiàn)在過(guò)去的時(shí)間 $time_passed = $c_time - $cache->get($t_key); $cache->set($t_key, $c_time, $ttl); //獲取桶中令牌數(shù) $allow = $cache->get($a_key); $allow += $time_passed * $rate; //加上最后一次消費(fèi)令牌到現(xiàn)在期間增長(zhǎng)的令牌數(shù) //令牌數(shù)不能超過(guò)最大數(shù) if ($allow > $maxRequests) { $allow = $maxRequests; } //使用的令牌數(shù)不能超過(guò)最大限制 if ($allow < $use) { $cache->set($a_key, $allow, $ttl); return 0; } else { //消費(fèi)令牌 $cache->set($a_key, $allow - $use, $ttl); return (int) ceil($allow); } } else { //記錄當(dāng)前時(shí)間為最后一次處理時(shí)間,用于下次使用 $cache->set($t_key, time(), $ttl); //沒(méi)有令牌時(shí)按照最大令牌數(shù)處理 $cache->set($a_key, $maxRequests - $use, $ttl); return $maxRequests; }參考資料
Token bucket wiki
PHP Rate Limiting Library With Token Bucket Algorithm
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28997.html
摘要:視頻介紹限流算法,分析漏桶算法和令牌算法的應(yīng)用場(chǎng)景,算法原理和算法實(shí)現(xiàn)方法視頻在這里分鐘看懂限流算法你好,我是好剛,這一講我們來(lái)了解限流算法。這里限流的常用算法有漏桶算法和令牌桶算法。所以令牌桶算法的特點(diǎn)是允許突發(fā)流量。 視頻介紹限流算法,分析漏桶算法和令牌算法的應(yīng)用場(chǎng)景,算法原理和算法實(shí)現(xiàn)方法 【視頻在這里】 8分鐘看懂限流算法 你好,我是好剛,這一講我們來(lái)了解限流算法 (Rate ...
摘要:接口限流的常用算法計(jì)數(shù)器法計(jì)數(shù)器法是限流算法里最簡(jiǎn)單也是最容易實(shí)現(xiàn)的一種算法。由此可見(jiàn),當(dāng)滑動(dòng)窗口的格子劃分的越多,那么滑動(dòng)窗口的滾動(dòng)就越平滑,限流的統(tǒng)計(jì)就會(huì)越精確。漏桶算法漏桶算法,又稱。 接口限流 什么是接口限流 那么什么是限流呢?顧名思義,限流就是限制流量,包括并發(fā)的流量和一定時(shí)間內(nèi)的總流量,就像你寬帶包了1個(gè)G的流量,用完了就沒(méi)了,所以控制你的使用頻率和單次使用的總消耗。通過(guò)限...
摘要:之前有了解到哥的一部分讀者們沒(méi)有充分搞清楚限流和熔斷的關(guān)系。后者表示系統(tǒng)在同一時(shí)刻能處理的最大請(qǐng)求數(shù)量,比如次的并發(fā)。后續(xù)限流策略需要設(shè)定的具體標(biāo)準(zhǔn)數(shù)值就是從這些指標(biāo)中來(lái)的。限流閾值不繼續(xù)處理請(qǐng)求。 如果這是第二次看到我的文章,歡迎掃描文末二維碼訂閱我喲~本文長(zhǎng)度為2869字,建議閱讀8分鐘。 可能你在網(wǎng)上看過(guò)不少「限流」相關(guān)的文章,但是z哥的這篇可能是最全面,最深入淺出的一篇了(容我...
摘要:自定義注解實(shí)現(xiàn)基于接口限流仔細(xì)看會(huì)發(fā)現(xiàn)上面的簡(jiǎn)單實(shí)現(xiàn)會(huì)造成我每個(gè)接口都要寫一次限流方法代碼很冗余所以采用來(lái)使用自定義注解來(lái)實(shí)現(xiàn)。 服務(wù)限流 -- 自定義注解基于RateLimiter實(shí)現(xiàn)接口限流 令牌桶限流算法showImg(https://segmentfault.com/img/bVbgTi6?w=2420&h=1547);圖片來(lái)自網(wǎng)上 令牌桶會(huì)以一個(gè)恒定的速率向固定容量大小桶...
摘要:關(guān)于如何限速,有兩個(gè)比較出名的算法,漏桶算法與令牌桶算法,這里對(duì)其簡(jiǎn)單介紹一下,最后再實(shí)踐在我發(fā)郵件的中以下是發(fā)送郵件的,已限制為一分鐘兩次,你可以通過(guò)修改進(jìn)行試驗(yàn)。 前段時(shí)間,我使用了 jwt 來(lái)實(shí)現(xiàn)郵箱驗(yàn)證碼的校驗(yàn)與用戶認(rèn)證與登錄,還特別寫了一篇文章作為總結(jié)。 在那篇文章中,提到了一個(gè)點(diǎn),如何限速。 在短信驗(yàn)證碼和郵箱驗(yàn)證碼,如果不限速,被惡意攻擊造成大量的 QPS,不僅拖垮了服務(wù)...
閱讀 3414·2021-10-08 10:15
閱讀 5628·2021-09-23 11:56
閱讀 1479·2019-08-30 15:55
閱讀 457·2019-08-29 16:05
閱讀 2740·2019-08-29 12:34
閱讀 2052·2019-08-29 12:18
閱讀 925·2019-08-26 12:02
閱讀 1661·2019-08-26 12:00