令牌桶和漏桶算法使用場景解析

文章目錄

  • 什么時候用令牌桶,什么時候用漏桶算法??
      • 先放結論
    • 兩個算法一眼看懂
    • 什么時候選令牌桶?
    • 什么時候選漏桶?
    • 組合用法(90% 的真實系統都會這么干)
      • 小結記憶
  • 對令牌桶和漏桶組合用法再次詳細敘述一下,以小紅書生活社區系統為例子
      • 為什么要 **“令牌桶 → 漏桶”** 組合?
    • 1. 小紅書請求鏈路示例
    • 2. 組合在小紅書的 **四個高頻場景**
    • 3. 配置與調優步驟(落地到小紅書)
    • 4. 代碼/配置片段示意
    • 5 · 常見誤區 & 小紅書踩坑實錄

什么時候用令牌桶,什么時候用漏桶算法??

先放結論

場景特征令牌桶(Token Bucket)漏桶(Leaky Bucket)
是否允許突發流量? 允許,可在桶里先攢“額度”,瞬時放量? 不允許,出流量永遠是勻速
對下游的壓力瞬時可能出現高并發,需要下游有一定緩沖或彈性始終平滑,幾乎不會壓垮下游
對實時性/時延要求突發時延小,整體時延可控峰值被“削平”,高峰請求會排隊、時延增大
典型用例API 網關限流、微服務之間“削峰”但保留突發、手機套餐計費交換機/路由器排隊、日志寫入磁盤、打印任務、銀行轉賬出賬口

兩個算法一眼看懂

關鍵詞令牌桶漏桶
本質“拿令牌才可通過”“進水隨意,出水勻速”
控制維度入流(允許多久發多少)出流(確保永遠固定速率)
可配置項生成速率 r、桶容量 b漏出速率 r、桶容量 b
能否積攢額度可以:桶里最多存 b 個令牌可以:桶里最多排隊 b 個請求
流量視角突發→滑動平均 ≤ r任何時刻 ≤ r

什么時候選令牌桶?

  1. 業務本身就是“偶有高峰”
    例:電商秒殺開始前 5 秒,令牌桶能攢夠令牌,瞬間放行指定量請求;后續再勻速補充。
  2. 下游能短暫擴容或有緩沖區
    比如使用異步隊列、K8s 自動擴縮容,可吃掉短時突發。
  3. 需要按“總量 + 峰值”計費/統計
    運營商對流量計費:保證平均速率,但允許你瞬時用掉“未用額度”。
  4. API 限流希望“好人優先”
    正常流量積攢令牌,機器人/爬蟲持續刷會很快耗盡令牌,被限速。

一句話令牌桶在乎“總量控制 + 瞬時彈性”。


什么時候選漏桶?

  1. 下游“吃不了”任何峰值,只能勻速消費
    打印機、磁帶機、磁盤順寫、第三方支付接口 QPS 固定。
  2. 希望徹底削峰平谷,保證穩定輸出
    視頻流推送、實時音頻、網絡芯片隊列,抖動越小越好。
  3. 時延可被犧牲換取穩定
    排隊時間增加也沒關系,例如批量日志落盤。
  4. 實現簡單、資源可預估
    只要求一個固定速率,不需要動態計算剩余令牌。

一句話漏桶在乎“絕對平滑 + 下游安全”。


組合用法(90% 的真實系統都會這么干)

  1. 入口令牌桶 —— 允許合規突發,把“洪峰”削到可控范圍。
  2. 出口漏桶 —— 對真正嬌貴的依賴再做一次勻速下沉。

這樣既不失靈活性,又能保護最脆弱的環節。很多 API 網關、CDN、大型分布式系統限流都是“先令牌桶,后漏桶”。


小結記憶

  • 令牌桶:能攢錢、能一次性花;平均不能超標。
  • 漏桶:只能領死工資;永遠 1、1、1… 勻速走。

選哪個?看你要不要“突發權”。如果答案是“要”—→令牌桶;如果答案是“絕不能”—→漏桶。

對令牌桶和漏桶組合用法再次詳細敘述一下,以小紅書生活社區系統為例子

為什么要 “令牌桶 → 漏桶” 組合?

在真實的大型社區里——小紅書就是典型——沒有一種單獨的限流算法能同時滿足「用戶體驗」和「核心依賴安全」 兩個目標:

目標令牌桶能做到漏桶能做到
秒級突發場景(雙 11、明星發筆記秒贊)依然“秒開”??
保護下游(數據庫、推薦 RPC、支付)絕不被瞬時打爆??

所以工業界普遍做法是:入口先令牌桶,出口再漏桶。下面用小紅書的典型流量路徑來拆一遍。


1. 小紅書請求鏈路示例

App/Web ? CDN ? API Gateway ? Notes Service ?│                        │(令牌桶限流)                 (漏桶勻速入庫 + MQ)
  1. API Gateway / 邊緣網關(令牌桶)

    • 粒度:用戶 ID + 接口(/notes/publish/notes/like 等)
    • 配置示例
      • 桶容量 B = 120(允許 2 分鐘的剩余額度)
      • 令牌速率 R = 60 req/min(每人每分鐘 60 次發帖接口)
    • 效果
      • 正常人偶爾連點「發布」也能秒過。
      • 連續腳本刷請求會瞬間耗空令牌,得到 429。
  2. 業務微服務(漏桶)

    • 場景Notes Service 里寫數據庫、調用內容審核、下發特點 feed 打分。
    • 實現
      入隊:任意速率
      出隊:固定 5 k/s → MySQL & Redis & AI 審核
      
    • 參數
      • 漏速 L = 5 000 req/s(后端表的寫入 QPS 壓測上限)
      • 桶深度 Q = 20 000(≈4 秒峰值緩沖)
    • 效果
      • 當明星空降帶來 10 k/s 發布洪峰時,隊列頂多攢 4 秒即被消化。
      • 如果洪峰持續更久,隊列溢出觸發降級(寫失敗重試 / 回退到異步草稿)。

2. 組合在小紅書的 四個高頻場景

場景入口令牌桶出口漏桶額外策略
筆記發布用戶維度限流,允許一鍵連發圖片轉碼、AI 審核勻速寫入超隊列 10 s 回退草稿,告知稍后發布
點贊/收藏用戶-接口維度令牌,防止機器腳本點贊寫 Redis,不需要漏桶;但寫 MySQL 日志走漏桶后端異步批量合并落庫
搜索熱詞IP + 用戶令牌桶,擋住爬蟲高頻搜索ES 查詢也做漏桶,勻速 2 k/s熱詞命中緩存直接返回
直播間打賞用戶余額操作需閃電響應→入口令牌桶 + 內存預扣金額入賬、流水寫賬務庫用漏桶賬務庫用 XA 事務,漏速按 TPS 上限

3. 配置與調優步驟(落地到小紅書)

  1. 抓歷史峰值
    • 查詢「雙 11」「618」「明星生日」當天 每 10 秒 的 QPS 波峰。
  2. 先配令牌桶
    • B ≈ R × 可接受峰值持續秒數(可逆算為「用戶能連點多少次不被限」)。
  3. 測后端極限
    • 對 MySQL / ES / 推薦 RPC 壓測,得出 L_max
  4. 配漏桶
    • L = 0.8 × L_max 預留 20 % 余量。
    • Q = L × 回滾/降級開銷秒數(如 4 秒)。
  5. 雙閾值監控
    • 隊列長度 > 0.6 Q:灰度告警,加實例。
    • 隊列長度 > 0.9 Q:熔斷低優接口或觸發靜默降級。

4. 代碼/配置片段示意

# 網關級(Kong / Envoy)
rate_limiting:name: notes_publish_token_bucketcapacity: 120        # Btokens_per_interval: 60     # Rinterval: 60sredis_slot: user_id# Notes Service(Go 偽碼)
leaky := NewLeakyBucket(leakRate = 5000,     // LqueueDepth = 20000,  // Q
)
for req := range inboundChan {if !leaky.Allow(req) {metrics.Publish("overflow")return ErrBusy             // 觸發降級}process(req)                   // 寫庫 + 審核 + MQ
}

5 · 常見誤區 & 小紅書踩坑實錄

#誤區(Anti-Pattern)真實后果 / 事故現場根因分析 & 解決策略
1只做令牌桶,不做漏桶2024 年某明星直播帶貨高峰,瞬時發帖 QPS 從 3 k 飆到 12 k;MySQL 主從延遲 30 s,導致點贊丟失、推薦時序錯亂令牌桶放行突發,卻沒人“剎車”數據庫 → 下游被沖垮
2漏桶漏速設太小春節活動,漏速僅 2 k/s;排隊深度 20 k 很快塞滿,發布接口耗時 > 10 s,被大量用戶投訴卡頓峰值持續時間被低估;隊列深度設計與峰值不匹配
3把漏桶做在網關層“全局公用”統一隊列里既有搜索也有發帖;一次搜索風暴讓發帖延遲 5 s——出現“木桶效應”業務優先級不同,卻共用同一桶
4令牌桶容量(B)設過大群控腳本低頻養號,10 min 內攢滿 600 token,隨后一鍵爆發 → 機器流量混在真人里逃過風控運維按“用戶體驗”放大 B,卻忽視惡意攢桶
5令牌桶按 IP 而非用戶限流學校/公司 NAT 出口下所有用戶共享同一 IP,晚高峰點贊被誤殺(429)多人共用 IP → token 爭搶
6漏桶沒有溢出策略活動推送 Bug 觸發 50 k/s 寫庫,隊列溢出后 JVM 直接 OOM隊列滿時仍強行入列
7未監控桶內指標一次 Gradual Release 沒人關注隊列水位,5 分鐘后才發現 MySQL 延遲;事故擴大隊列長度、等待時長無可觀測
8跨機房分布式令牌桶未同步A 機房峰值被擋住,B 機房因未同步令牌被打爆;兩邊用戶體驗不一致本地緩存令牌導致“各自為政”
9漏桶排隊里混入長耗時任務AI 審核超時 2 s,阻塞后面的 1000 條快速寫入請求漏桶只是勻速出隊,內部仍可能被慢請求“撐爆”
10冷熱啟停未預熱令牌桶服務重啟后令牌桶空,導致 10 s 內 90 % 用戶請求 429冷啟動沒有令牌

經驗總覽:先用數據推“峰值 × 持續時間”,再對照下游極限設 B, R, L, Q;并且 每個微服務自己兜底、監控可觀測、溢出有降級

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80257.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp|實現獲取手機攝像頭權限,調用相機拍照實現人臉識別相似度對比,拍照保存至相冊,多端兼容(APP/微信小程序)

基于uniapp以及微信小程序實現移動端人臉識別相似度對比,實現攝像頭、相冊權限獲取、相機模塊交互、第三方識別集成等功能,附完整代碼。 目錄 核心功能實現流程攝像頭與相冊權限申請權限拒絕后的引導策略攝像頭調用拍照事件處理人臉識別集成圖片預處理(Base64編碼/壓縮)調用…

OpenCV CUDA 模塊中用于在 GPU 上計算兩個數組對應元素差值的絕對值函數absdiff(

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 void cv::cuda::absdiff 是 OpenCV CUDA 模塊中的一個函數,用于在 GPU 上計算兩個數組對應元素差值的絕對值。 該函數會逐元素計算兩…

Rust 數據結構:HashMap

Rust 數據結構:HashMap Rust 數據結構:HashMap創建一個新的哈希映射HashMap::new()將元組變成哈希表 訪問哈希映射中的值哈希映射和所有權更新哈希映射重寫一個值僅當鍵不存在時才添加鍵和值基于舊值更新值 散列函數 Rust 數據結構:HashMap …

【從設置到上傳的全過程】本地多個hexo博客,怎么設置ssh才不會互相影響

偶然間,想多建一個博客,但電腦已經有一個博客了,怎么設置ssh才不會互相影響呢? 在 Windows 系統上設置多個 Hexo 博客的 SSH 配置,避免互相影響,通常戶就需要為每個博客配置不同的 SSH 密鑰,并…

【時時三省】(C語言基礎)字符數組應用舉例2

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 例題: 有3個字符串,要求找出其中“最大”者。 解題思路: 可以設一個二維的字符數組str,大小為320,即有3行20列(每一…

2025認證杯挑戰賽第二階段B題【 謠言在社交網絡上的傳播 】原創論文講解(含完整python代碼)

大家好呀,從發布賽題一直到現在,總算完成了認證杯數學中國數學建模網絡挑戰賽第二階段B題目謠言在社交網絡上的傳播完整的成品論文。 本論文可以保證原創,保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半…

Qt功能區:Ribbon使用

Ribbon使用 1. Ribbon功能區介紹1.1 樣式 2. 基本功能區設置2.1 安裝動態庫(推薦)2.2 在MainWindow中使用Ribbon2.3 在QWidget中使用SARibbonBar2.4 創建Category和Pannel2.5 ContextCategory 上下文標簽創建 2.6 ApplicationButton2.7 QuickAccessBar和…

Ubnutu ADB 無法識別設備的解決方法

1. 正確安裝adb 下載地址 2. 檢查 Linux 是否識別設備 lsusb通過上述指令,分別查詢插入、斷開設備的usb設備表,如下所示: # 插入設備 adbc:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 011:…

C# 實現雪花算法(Snowflake Algorithm)詳解與應用

在現代分布式系統中,生成全局唯一的標識符(ID)是一個非常重要的問題。隨著微服務架構和分布式系統的普及,傳統的單機數據庫生成 ID 的方式已無法滿足高并發和高可用的需求。為了解決這個問題,Twitter 提出了 雪花算法&…

STM32+ESP8266連接onenet新平臺

若該文為原創文章,轉載請注明原文出處。 阿里云物聯網平臺無法開通了,所以嘗試使用onenet平臺。 一、硬件 1、STM32F103C8T6最?系統板 2、ESP-01S 3、DHT11 二、軟件 1、KEIL5.29 2、Token生成工具 3、app inventor 三、原理 四、平臺搭建 1、注…

深入解析Spring Boot與Redis集成:高效緩存實踐

深入解析Spring Boot與Redis集成:高效緩存實踐 引言 在現代Web應用開發中,緩存技術是提升系統性能的重要手段之一。Redis作為一種高性能的鍵值存儲數據庫,廣泛應用于緩存、會話管理和消息隊列等場景。本文將詳細介紹如何在Spring Boot項目中…

Python自學筆記3 常見運算符

常用運算符 加減法 python的自動數據類型轉換 整形轉為浮點型 實數轉為復數 數字類型不能和浮點數類型相加減 乘除法 數據轉換基本同加減法, 但字符串可以和整數相加減,作用是字符串的自我復制 反斜杠 成員運算符 判斷一個元素是不是一個序列的成員…

[特殊字符]接口測試用例設計指南:全面覆蓋與精準驗證

一、接口測試的核心價值 接口作為系統間通信的橋梁,其穩定性和準確性直接影響業務功能。通過科學設計的測試用例,可以提前暴露接口潛在缺陷,降低上下游系統的耦合風險。本文將系統講解接口測試的用例設計策略,覆蓋查詢類接口與操…

[SpringBoot]Spring MVC(2.0)

緊接上文,這篇我們繼續講剩下的HTTp請求 傳遞JSON數據 簡單來說:JSON就是?種數據格式,有??的格式和語法,使??本表??個對象或數組的信息,因此JSON本質是字符串. 主要負責在不同的語?中數據傳遞和交換 JSON的語法 1. 數據在 鍵值對(Key/Value) …

錨點跳轉跟蹤#

一、html <div ref"computingref"><section id"section1"> </section><section id"section2"> </section><section id"section3"> </section> </div><div class"nav-list&q…

一文了解多模態大模型LLaVA與LLaMA的概念

目錄 一、引言 二、LLaVA與LLaMA的定義 2.1 LLaMA 2.2 LLaVA 2.3 LLaVA-NeXT 的技術突破 三、產生的背景 3.1 LLaMA的背景 3.2 LLaVA的背景 四、與其他競品的對比 4.1 LLaMA的競品 4.2 LLaVA的競品 五、應用場景 5.1 LLaMA的應用場景 5.2 LLaVA的應用場景 六…

【LLM】大模型算力基礎設施——核心硬件GPU/TPU,架構技術NVLink/RDMA,性能指標FP64/FLOPS(NVIDIA Tesla型號表)

【LLM】大模型算力基礎設施——核心硬件GPU/TPU&#xff0c;架構技術NVLink/RDMA&#xff0c;性能指標FP64/FLOPS&#xff08;NVIDIA Tesla型號表&#xff09; 文章目錄 1、核心硬件GPU/TPU&#xff0c;NVIDIA Tesla2、集群架構設計 NVLink / RDMA / Alluxio3、性能關鍵指標&am…

spark的Standalone模式介紹

Apache Spark 的 Standalone 模式是其自帶的集群管理模式&#xff0c;無需依賴外部資源管理器&#xff08;如 YARN 或 Mesos&#xff09;&#xff0c;可快速部署和運行 Spark 集群。以下是對 Standalone 模式的詳細介紹&#xff1a; 1. 核心組件 Master 節點 集群的主控制器…

YOLOv7訓練時4個類別只出2個類別

正常是4個類別&#xff1a; 但是YOLOv7訓練完后預測總是只有兩個類別&#xff1a; 而且都是LFM和SFM 我一開始檢查了下特征圖大小&#xff0c;如果輸入是640*640的話&#xff0c;三個尺度特征圖是80*80,40*40,20*20&#xff1b;如果輸入是416*416的話&#xff0c;三個尺度特征…

【Unity】用事件廣播的方式實現游戲暫停,簡單且實用!

1.前言 在做Unity項目的時候&#xff0c;要考慮到“游戲暫停”的功能&#xff0c;最直接的辦法是修改游戲的Time.TimeScale 0f。但是這種方式的影響也比較大&#xff0c;因為它會導致游戲中很多程序無法正常運行。 于是我就有了一個想法&#xff0c;在游戲中想要暫停的對象&…