接口限頻算法:漏桶算法、令牌桶算法、滑動窗口算法

文章目錄

  • 限頻三大算法對比與選型建議
  • 一、漏桶算法(Leaky Bucket Algorithm)
    • 1.核心原理
    • 2.實現
    • 3.為什么要限制漏桶容量
    • 4.優缺點分析
  • 二、令牌桶算法(Token Bucket Algorithm)
    • 1.核心原理
    • 2.實現
      • (1)單機實現
      • (2)分布式實現
    • 3.優缺點分析
  • 三、滑動窗口算法(Sliding Window Algorithm)
    • 1.核心原理
    • 2.實現
    • 3.優缺點分析

限頻三大算法對比與選型建議

維度漏桶算法令牌桶算法滑動窗口算法
流量平滑性強(固定速率)中(允許突發)弱(依賴窗口粒度)
實現復雜度簡單中等(需處理令牌生成)中等(需處理窗口滑動)

一、漏桶算法(Leaky Bucket Algorithm)

1.核心原理

漏桶算法的核心是恒定速率輸出,無論輸入流量如何波動,輸出始終保持穩定。其工作機制可類比為一個底部有固定孔徑的水桶:

  • 輸入:請求以任意速率流入桶中(如突發流量)。
  • 輸出:桶以固定速率(如100請求/秒)處理請求,超出桶容量的請求直接丟棄。

2.實現

  • 實現:使用隊列存儲請求,通過定時任務以固定速率從隊列中取出請求處理。若隊列滿則拒絕新請求。

在非單節點場景下,可使用消息隊列中間件,或者Redis模擬隊列,來實現這個算法。

3.為什么要限制漏桶容量

有容量限制 vs 無容量限制:對比分析

場景有容量限制(標準漏桶)無容量限制(無限漏桶)
流量平滑效果? 穩定輸出,突發請求被緩存或丟棄? 穩定輸出(但突發請求全部緩存)
內存/緩沖區占用🟡 有限占用(取決于桶容量)? 可能無限占用,導致OOM(內存溢出)
突發流量處理🟡 超過容量的請求被丟棄,保護下游系統? 緩存所有請求,下游可能被持續高負載拖垮
適用場景真實系統(如API接口限頻、網絡流量控制)理論場景(無實際意義,無法用于生產環境)

4.優缺點分析

  • 優點
    • 絕對平滑:嚴格控制輸出速率,適合對穩定性要求極高的場景(如金融交易接口)。
    • 實現簡單:只需維護隊列和固定速率處理器,無需復雜邏輯。
  • 缺點
    • 資源浪費:突發流量會被直接丟棄,無法利用系統空閑資源。
    • 靈活性差:無法區分請求優先級,所有超額請求同等處理。

二、令牌桶算法(Token Bucket Algorithm)

1.核心原理

令牌桶算法通過令牌生成與消耗實現限流,允許一定程度的突發流量:

  • 令牌生成:系統以固定速率(如100令牌/秒)向桶中添加令牌,桶容量上限為burst_size(如200令牌)。
  • 請求處理:每個請求需消耗一個令牌,無令牌則拒絕。若桶滿,新生成的令牌會被丟棄。

2.實現

(1)單機實現

Guava的RateLimiter采用令牌桶算法,支持動態調整速率和突發容量。

RateLimiter rateLimiter = RateLimiter.create(100.0); // 每秒生成100令牌
if (rateLimiter.tryAcquire()) { // 嘗試獲取令牌// 處理請求
} else {// 限流
}

(2)分布式實現

在分布式系統中,可以利用 Redis 的原子操作和 Lua 腳本來實現一個線程安全的令牌桶。

  • 使用 Redis 實現令牌桶的關鍵在于:
    • 使用原子操作保證令牌增減的線程安全
    • 實現令牌的自動生成邏輯
    • 高效地判斷是否允許請求通過
原子操作
允許
拒絕
獲取令牌數與時間戳
執行Lua腳本
計算時間差
計算新生成令牌數
計算當前可用令牌數
判斷是否足夠?
消耗令牌
拒絕請求
更新Redis狀態
返回處理結果
客戶端請求
獲取當前時間戳
拼接Redis鍵
是否允許?
執行業務邏輯
返回限流響應

3.優缺點分析

  • 優點
    • 支持突發流量:允許短時間內消耗桶內累積的令牌,提升資源利用率(如電商秒殺)。
    • 參數靈活:可通過調整rate(平均速率)和burst_size(突發容量)平衡平滑性與突發性。
  • 缺點
    • 實現復雜度較高:需維護令牌生成、存儲和消耗邏輯。
    • 流量尖刺風險:突發流量可能瞬間耗盡令牌,導致后續請求被拒絕。

三、滑動窗口算法(Sliding Window Algorithm)

1.核心原理

滑動窗口算法通過時間窗口劃分與計數實現限流,精度隨窗口細分而提升:

  • 窗口劃分:將時間軸劃分為多個固定長度的子窗口(如1秒劃分為10個0.1秒的子窗口)。
  • 計數與滑動:統計當前窗口內的請求數,當窗口滑動時,舊子窗口的計數逐漸過期。

2.實現

在分布式系統中,可以利用 Redis 的原子操作和 Lua 腳本來實現一個這個算法。

Redis Lua腳本邏輯
獲取窗口內所有時間戳
通過Lua腳本操作Redis
移除過期時間戳< current_time - T
添加當前時間戳到窗口
統計窗口內時間戳數量
判斷數量是否超過閾值N
客戶端請求
獲取當前時間戳
生成窗口鍵key
拒絕請求
允許請求

3.優缺點分析

  • 優點
    • 時間敏感性強:可精確控制時間維度的請求頻率(如“每分鐘最多100次”)。
    • 動態調整窗口:支持秒級、分鐘級等不同粒度的限流規則。
  • 缺點
    • 臨界問題:窗口切換時可能出現雙倍請求(如0.9秒和1.1秒各發100次)。
    • 分布式同步成本:需依賴Redis等分布式緩存,引入額外延遲。

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

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

相關文章

HTML5 盒子模型

1. 盒子模型的概念 2. 邊框&#xff08;border&#xff09; 邊框顏色&#xff08;border-color&#xff09; 邊框粗細&#xff08;border-width&#xff09; 邊框樣式&#xff08;border-style&#xff09; border簡寫&#xff08;border&#xff1a;&#xff09; 3. 外邊距&am…

【Linux】Linux高級I/O

參考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/128345976 一、五種IO模型 阻塞式I/O非阻塞式I/OI/O復用&#xff08;多路轉接&#xff09;信號驅動式I/O異步I/O I/O我們并不陌生&#xff0c;簡單的說就是輸入輸出&#xff1b;對于一個輸入操作通常包…

關于界面存在AB測試后UI刷新空白的問題

問題描述&#xff1a; 在同一頁面存在AB面&#xff0c;A和B同時都有一個rv&#xff0c;然后A面的rv填充不了數據&#xff0c;B面的可以。 問題解決&#xff1a; header_task布局里的include_new_gift_sign里有一個和外層一樣id的recyclerview include的標簽的作用是。在infl…

Go 協程(Goroutine)入門與基礎使用

一、什么是協程&#xff08;Goroutine&#xff09;&#xff1f; 簡單來說&#xff0c;協程是由 Go 語言運行時管理的輕量級線程。相比系統線程&#xff0c;它的調度開銷極小&#xff0c;內存占用非常少&#xff08;默認只需 2KB 棧空間&#xff09;。 你可以在一個程序中輕松…

matlab 各種智能優化算法

1. 優化算法相關 蟻群優化算法&#xff08;ACO&#xff09; 蟻群優化算法是一種模擬螞蟻覓食行為的優化技術。以下是一個簡化版的ACO用于解決旅行商問題&#xff08;TSP&#xff09;的MATLAB代碼&#xff1a; function [bestRoute, minDist] acoTsp(distMatrix, numAnts, n…

Hilt -> Android 專屬依賴注入(DI)框架

Hilt 是 Google 基于 Dagger 封裝的 Android 專屬依賴注入&#xff08;DI&#xff09;框架&#xff0c;顯著簡化了依賴管理流程&#xff0c;提升代碼可維護性和可測試性。以下是核心要點及使用指南&#xff1a; dagger2: Dagger 2 原理和使用-CSDN博客 Hilt vs Dagger2&…

AISHELL-5 全球首套智能駕艙中文語音交互數據集開源

隨著汽車成為人們日常生活中不可或缺的一部分&#xff0c;而駕駛艙中傳統的觸摸交互方式容易分散駕駛員的注意力&#xff0c;存在安全風險&#xff0c;因此&#xff0c;車內基于語音的交互方式得到重視。與通常家庭或會議場景中的語音識別系統不同&#xff0c;駕駛場景中的系統…

openstack之neutron(一)

NFV基礎 neutron是對二層物理網絡的抽象與管理&#xff0c;實例的網絡功能由連接到vSwitch的端口上的vNIC共同實現&#xff0c;再通過物理服務器的物理網卡訪問外部的物理網絡。 NFV實現 網卡虛擬化&#xff1a;tap、tun、veth&#xff1b; 交換機虛擬化&#xff1a;linuxbri…

【Java】Arrays.sort:TimSort

一&#xff0c;概述 書接前文【Java】Arrays.sort:DualPivotQuicksort-CSDN博客 Arrays.sort對基本數據類型使用了雙軸快速排序&#xff0c;但是對Object[]類型&#xff0c;則使用了TimSort&#xff0c;TimSort是穩定的排序&#xff0c;它整合了插入排序歸并排序&#xff0c;…

一個n8n構建的能和LLM對話的Agent

一個n8n構建的能和LLM對話的Agent 1.OLLAMA1.1.下載和安裝1.2.設置環境變量1.3.重啟ollama1.4.測試1.5.拉取模型2.n8n部署2.1. 鏡像拉取和啟動2.2.注冊和登錄2.3.新建一個工作流3.說在后面的話環境搭建說明: windows(RTX 5090)+VM CENTOS 采用本地化的ollama運行LLM n8n是一…

升級 Ubuntu Linux 內核的幾種不同方法

方法 &#xff11; &#xff0d; 使用 dpkg 升級 Linux 內核&#xff08;手動方式&#xff09; 這個方法可以幫助你從 kernel.ubuntu.com 網站手動下載可用的最新 Linux 內核。如果你打算安裝最新版&#xff08;而不是穩定版或者正式發布版&#xff09;&#xff0c;那這種方法…

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一個位于網站根目錄下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指導網絡爬蟲&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取該網站的內容。這個文件遵循 Robots…

Linux 內核 Slab 分配器核心組件詳解

Slab 分配器是 Linux 內核中用于高效管理內存的機制&#xff0c;其核心目標是通過對象緩存減少內存碎片和分配/釋放開銷。以下詳細解析其核心組件及其協作關系&#xff1a; 一、Slab 系統的核心組件 組件 描述 作用場景 Slab 描述符 每個 Slab 的管理結構&#xff08;如 struc…

Oracle 的AHF (Automatic Health Framework) 工具

Oracle 的AHF (Automatic Health Framework) 工具 Oracle AHF (Automatic Health Framework) 是 Oracle 官方提供的診斷工具集合&#xff0c;用于自動收集、分析和診斷 Oracle 數據庫及集群環境的健康狀態和問題。 一 AHF 核心功能概述 1. 主要組件 TFA (Trace File Analyz…

華為服務器obsutil使用方法

本文不生產技術&#xff0c;只做技術的搬運工&#xff01;&#xff01;&#xff01; 前言 最近在使用華為云服務器進行模型訓練&#xff0c;發現其上傳下載文件都極慢&#xff0c;詢問華為官方人員是否限速&#xff0c;對方推薦使用obsutil作為中轉服務進行下載&#xff0c;在…

【大模型訓練】中短序列attention 和MOE層并行方式(二)

我們考慮一個典型的Transformer模型結構&#xff0c;在多層堆疊中&#xff0c;其中包含Attention層和MoE層&#xff08;FeedForward層被替換為MoE層&#xff09;。在模型最后是LM Head&#xff08;語言模型頭&#xff09;&#xff0c;通常是一個全連接層&#xff0c;將隱層向量…

2025-06-09(批量智能裁剪視頻尺寸并延長視頻時長)

import os import subprocess import random import json # 配置參數 TARGET_WIDTH 500 TARGET_HEIGHT 600 TARGET_DURATION 180 # 目標時長&#xff08;秒&#xff09; OUTPUT_DIR "processed_videos" MIRROR_MODES ["none", "horizontal&quo…

CKA考試知識點分享(9)---gateway api

CKA 版本&#xff1a;1.32 第九套題是涉及gateway api相關。 注意&#xff1a;本文不是題目&#xff0c;只是為了學習相關知識點做的實驗。僅供參考 實驗目的 創建一個gateway api&#xff0c;來實現后端鏡像的外部訪問。 gateway api 通過nginx實現 實驗開始 安裝nginx ga…

Kafka 消息模式實戰:從簡單隊列到流處理(一)

一、Kafka 簡介 ** Kafka 是一種分布式的、基于發布 / 訂閱的消息系統&#xff0c;由 LinkedIn 公司開發&#xff0c;并于 2011 年開源&#xff0c;后來成為 Apache 基金會的頂級項目。它最初的設計目標是處理 LinkedIn 公司的海量數據&#xff0c;如用戶活動跟蹤、消息傳遞和…

Linux中使用yum安裝MYSQL

1、關系型數據庫 MySQL 使用 yum 安裝mysql 1、檢查是否已經安裝 Mysql rpm -qa | grep mysql如果安裝了 就進行卸載 rpm -e mysql-community-libs-5.7.44-1.el7.x86_64 rpm -e mysql57-community-release-el7-11.noarch rpm -e mysql-community-common-5.7.44-1.el7.x86_64…