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