每日面試題10:令牌桶

令牌桶算法:優雅的流量控制藝術

在現代分布式系統中,流量控制如同交通信號燈般重要——它既不能讓請求"堵死"系統,也不能放任流量"橫沖直撞"。令牌桶算法(Token Bucket Algorithm)正是這樣一種精妙的流量控制機制,它像一個智能的"漏斗",既能平穩疏導請求洪流,又能靈活應對突發流量。下面讓我們深入解析這個經典算法。


一、令牌桶算法:基本原理

令牌桶算法的核心思想可以概括為:

??"以固定速率向桶中添加令牌,請求需獲取令牌才能執行,桶滿則令牌暫存,桶空則請求等待"??

具體運作機制如下:

  1. ??桶的容量(Capacity)??

    • 桶的最大容量決定了系統允許的??最大突發流量??
    • 例如:容量=10表示系統最多可一次性處理10個請求
  2. ??令牌生成速率(Refill Rate)??

    • 系統以恒定速率向桶中添加令牌(如每秒1個令牌)
    • 這決定了系統的??長期平均處理速率??
  3. ??令牌獲取規則??

    • 當請求到達時:
      • 若桶中有令牌 → 取走令牌,請求立即執行
      • 若桶為空 → 請求必須等待直到有足夠令牌(或直接拒絕)
  4. ??動態平衡特性??

    • 桶未滿時:新令牌持續填充(速率=生成速率)
    • 桶已滿時:新令牌被丟棄(不會導致桶溢出)

https://example.com/token-bucket-diagram.png
(示意圖:令牌以固定速率添加,請求按需消耗令牌)


二、令牌桶 vs 漏桶:兩種流量控制策略對比
特性令牌桶算法漏桶算法
??流量整形方向??控制請求進入速率控制請求離開速率
??突發流量處理??允許一定突發(消耗積累令牌)嚴格平滑輸出(固定速率)
??實現復雜度??較簡單相對復雜
??典型應用場景??API限流、網絡擁塞控制流量整形、平滑輸出

??關鍵區別??:令牌桶是"請求驅動"(請求消耗令牌),漏桶是"系統驅動"(系統固定速率處理)


三、令牌桶的核心作用
  1. ??防止系統過載??

    • 通過限制單位時間內的請求處理量,避免資源耗盡(如數據庫連接池打滿)
  2. ??保障服務質量(QoS)??

    • 確保高優先級請求在流量高峰時仍能獲得資源
  3. ??靈活應對突發流量??

    • 允許短時間內的請求峰值(如秒殺活動開始時的瞬時流量)
  4. ??分布式系統協調??

    • 在微服務架構中實現跨服務的統一限流策略

四、令牌桶的典型應用場景
  1. ??API網關限流??

    • 例如:Spring Cloud Gateway集成Redis實現的分布式令牌桶
  2. ??網絡安全防護??

    • 防御DDoS攻擊:限制單個IP的請求速率
  3. ??消息隊列消費控制??

    • Kafka消費者以固定速率拉取消息,避免下游系統過載
  4. ??云計算資源調度??

    • 云服務商對用戶API調用進行配額管理

五、令牌桶的實現要點(偽代碼示例)
class TokenBucket:def __init__(self, capacity, refill_rate):self.capacity = capacity      # 桶容量self.tokens = capacity        # 當前令牌數self.refill_rate = refill_rate # 令牌生成速率(令牌/秒)self.last_refill_time = time.time()  # 上次填充時間def allow_request(self, tokens_needed=1):# 計算自上次填充以來新增的令牌now = time.time()elapsed = now - self.last_refill_timenew_tokens = elapsed * self.refill_rate# 填充令牌(不超過容量)self.tokens = min(self.capacity, self.tokens + new_tokens)self.last_refill_time = now# 檢查是否有足夠令牌if self.tokens >= tokens_needed:self.tokens -= tokens_neededreturn Truereturn False

??關鍵參數調優建議??:

  • 容量設置:建議為平均流量的2-3倍以容納突發
  • 生成速率:根據系統處理能力設定(如QPS上限)

六、進階思考:分布式令牌桶

在微服務架構中,單機令牌桶存在局限性。解決方案包括:

  1. ??Redis + Lua腳本??

    • 利用Redis的原子操作實現分布式計數器
    • 通過Lua腳本保證"檢查令牌+消耗令牌"的原子性
  2. ??中間件方案??

    • 使用Sentinel、Resilience4j等成熟組件
    • 支持動態配置限流規則
  3. ??自適應令牌桶??

    • 根據系統負載動態調整生成速率
    • 實現更智能的流量控制

總結

令牌桶算法以其優雅的設計,在"嚴格限制"與"靈活應對"之間找到了完美平衡。它既像一位嚴謹的交通警察,確保請求有序通過;又像一位貼心的服務生,在高峰期能靈活調配資源。理解并合理應用令牌桶算法,將為你的系統構筑起一道可靠的流量防線。

??實踐建議??:

  1. 在API網關層實施全局限流
  2. 關鍵業務接口設置獨立令牌桶
  3. 結合熔斷降級機制形成完整防護鏈

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

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

相關文章

【java】消息推送

文章目錄Java網頁消息推送解決方案 短輪詢、長輪詢、SSE、Websocket

STM32 | 有源蜂鳴器響,無源蜂鳴器播音樂

目錄 Overview 有源蜂鳴器 無源蜂鳴器 有源蜂鳴器控制 GPIO配置 控制程序 無源蜂鳴器控制 反轉GPIO控制 GPIO配置 控制接口 PWM控制 GPIO配置 控制函數 改變頻率播音樂 原理 1. 頻率決定音調 2. 占空比決定音量 GPIO初始化 結構體定義和音符頻率表 播放接口 …

第十四章 gin基礎

文章目錄Gin快速搭建一個web服務Gin數據交互JSON串內容規范Gin使用結構體返回數據給前端Gin配置POST類型的路由Gin獲取GET請求參數Gin獲取POST請求參數-form-data類型Gin獲取POST請求參數-JSON類型Gin獲取參數綁定至結構體Gin快速搭建一個web服務 下載包 \\新建一個文件&…

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)工業相機使用YoloV8模型實現PCB的缺陷檢測工業相機實現YoloV8模型實現PCB的缺陷檢測的技術背景在相機SDK中獲取圖像轉換圖像的代碼分析工業相機圖…

【Vivado那些事兒】AMD-XILINX 7系列比特流加密

前提:加密有風險,操作需謹慎前言在許多項目中,經過漫長的等待,我們的 FPGA 設計終于可以投入現場部署了。前期的資金的投入及知識產權的保護,我們需要對現場部署的 FPGA 進行比特流保護以防止逆向工程和未經授權的重復…

RK3588 安卓adb操作

adb(Android Debug Bridge)是一個用于與安卓設備進行通信和控制的工具。adb可以通過USB或無線網絡連接安卓設備,執行各種命令,如安裝和卸載應用,傳輸文件,查看日志,運行shell命令等。adb是安卓開…

【華為機試】70. 爬樓梯

文章目錄70. 爬樓梯描述示例 1示例 2提示解題思路核心分析問題建模算法實現方法1:動態規劃(標準解法)方法2:空間優化動態規劃(最優解)方法3:遞歸 記憶化方法4:數學公式(…

山東大學軟件學院面向對象期末復習

面向對象 文章目錄面向對象04 類封裝接口 抽象類05 消息,實例化,靜態變量方法消息動/靜態類型語言對象創建類及實例具有下面特征對象數組的創建靜態數據成員構造函數06_0 繼承繼承是向下傳遞的JAVA為什么不支持多重繼承繼承的形式特殊化繼承替換原則規范…

讓 Windows 用上 macOS 的系統下載與保姆級使用教程

模擬蘋果桌面軟件下載:https://xpan.com.cn/s/8NFAGT 還記得 Windows 11剛發布時,很多人就說“果里果氣"的,但界面確實做的漂亮。 不知道現在有多少小伙伴正用著macOS,不過我敢確定,喜歡macOS的人絕對不少&#…

嵌入式硬件篇---繼電器

繼電器是一種通過小電流控制大電流的電磁開關,廣泛應用于自動化控制、電力系統和電子設備中。以下從工作原理、應用場景和電路特點三個方面詳細介紹:一、工作原理繼電器本質是電磁控制的機械式開關,核心部件包括:線圈(…

鴻蒙網絡編程系列58-倉頡版TLS數字證書查看及驗簽示例

1. TLS數字證書驗簽簡介 數字證書的簽名驗證是網絡編程中一個重要的功能,它保證了數字證書是由可信任的簽發方簽署的,在此基礎上,我們才可以信任該證書,進而信任基于該證書建立的安全通道,所以說,數字證書…

【React Native】安裝配置 Expo Router

過去開發React Native,所使用的路由都是React Navigation。但是這個東西使用起來非常困難,配置無比繁瑣。Expo,為了簡化操作,就基于React Navigation開發了Expo Router。 Expo Router用起來就要簡單的多了,配置也相對…

美國VPS服務器Linux內核參數調優的實踐與驗證

美國vps服務器Linux內核參數調優的實踐與驗證在云計算和虛擬化技術日益普及的今天,美國VPS服務器因其穩定的網絡環境和優越的性價比,成為眾多企業和開發者的首選。Linux內核參數的默認配置往往無法充分發揮VPS的性能潛力。本文將深入探討美國VPS服務器上…

在Vscode中使用Kimi K2模型:實踐指南,三分鐘生成個小游戲

Kimi K2是一款基于多專家(MoE)架構的強大代碼與代理能力基礎模型。本文將通過在VS Code及其擴展Cline和RooCode中的實際應用,詳細說明如何使用Kimi K2-0711-preview模型。不得不說kimi這次的K2模型就是強大,在vscode中配置使用體驗…

基于SpringBoot+Uniapp球場預約小程序(騰訊地圖API、Echarts圖形化分析、二維碼識別)

“ 🎈系統亮點:騰訊地圖API、Echarts圖形化分析、二維碼識別”01系統開發工具與環境搭建前后端分離架構 項目架構:B/S架構 運行環境:win10/win11、jdk17前端: 技術:框架Vue.js;UI庫:…

windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug調試

windows phpstorm 2024 phpstudy 8 php7.3 thinkphp6 配置xdebug調試 下載配置phpstudyPhp.ini配置phpstorm配置xdebug運行一會就停了配置虛擬機 0localhost_90.conf 配置php.ini配置下載 在下面地址下載合適的xdebug 放到對應的php https://xdebug.org/wizard 配置phpst…

python的pywebview庫結合Flask和waitress開發桌面應用程序簡介

pywebview的用途與特點 用途 pywebview是一個輕量級Python庫,用于創建桌面應用程序(GUI)。它通過嵌入Web瀏覽器組件(如Windows的Edge/IE、macOS的WebKit、Linux的GTK WebKit),允許開發者使用HTML/CSS/Java…

C#通過HslCommunication連接西門子PLC1200,并防止數據跳動的通用方法

textEdit30.Text ReadValue<int>(() > plc.ReadInt32("DB57.DBD16"), ref _last_num).ToString();// 通用讀取方法&#xff08;支持所有值類型&#xff09;private T ReadValue<T>(Func<OperateResult<T>> readFunc, ref T lastValue) w…

Linux切換到Jenkins用戶解決Jenkins Host key verification failed

以root或sudo user身份, 切換到jenkins用戶 su -s /bin/bash jenkins前往jenkins的home目錄 cd /var/lib/jenkins/查看.ssh下是否已經有known_hosts, 有的話, 是什么內容, 正常情況下, 這時候是沒有對應IP記錄的 cd .ssh/ more known_hosts訪問一下對應IP, 記錄公鑰 ssh 192.16…

7.17 Java基礎 | 集合框架(下)

接上文&#xff1a; 7.16 Java基礎 | 集合框架&#xff08;上&#xff09;-CSDN博客 【1】Map集合 Map 集合是一種能存儲鍵值對的數據結構。它的主要功能是依據鍵&#xff08;Key&#xff09;來快速查找對應的值&#xff08;Value&#xff09; 1、聲明 Map<Integer,Integer…