【分布式】分布式限流方案解析

文章目錄

  • 固定窗口限流方案?
    • 實現方式?
    • 優點?
    • 缺點?
  • 滑動窗口限流方案?
    • 實現方式?
    • 優點?
    • 缺點?
  • 令牌桶限流方案?
    • 實現方式?
    • 優點?
    • 缺點?
  • 漏斗限流方案?
    • 實現方式?
    • 優點?
    • 缺點?

在分布式系統蓬勃發展的當下,系統面臨的流量挑戰日益復雜。為確保系統在高并發場景下的穩定性與可用性,限流策略成為了關鍵防線。本文將深入探討固定窗口、滑動窗口、令牌桶以及漏斗這四種常見的分布式限流方案,詳細剖析它們的實現原理、各自的優缺點,助力開發者在實際項目中做出最優選擇。?

固定窗口限流方案?

實現方式?

固定窗口限流是最為基礎的限流策略。它將時間劃分為固定長度的窗口,在每個窗口內,記錄請求的數量。當請求到達時,判斷當前窗口內的請求計數是否超過設定的閾值。若未超過,則允許請求通過,并將計數加一;若超過閾值,則拒絕請求。例如,設定一個窗口時長為 1 分鐘,限流閾值為 100 次請求。在每分鐘開始時,計數器重置為 0,每來一次請求,計數器增加 1,若在這 1 分鐘內請求次數達到 101 次,后續請求將被拒絕。?

優點?

實現簡單:邏輯直接明了,易于理解和編碼實現,對開發人員的技術要求相對較低。?
計算量小:僅需維護一個簡單的計數器和時間窗口標識,在高并發場景下,對系統資源的消耗較少。?

缺點?

存在流量突刺問題:假設窗口時長為 1 分鐘,限流閾值為 100。在第一個窗口的最后一秒涌入 100 個請求,緊接著下一個窗口開始的第一秒又涌入 100 個請求,這樣在 2 秒內系統就承受了 200 個請求,遠超預期的平均限流速率,可能導致系統瞬間壓力過大甚至崩潰。?
限流不夠精準:它只能控制每個固定窗口內的總請求數,無法對窗口內不同時間段的流量進行精細控制。?

滑動窗口限流方案?

實現方式?

滑動窗口是對固定窗口的優化。它將時間窗口進行細分,例如把 1 分鐘的窗口劃分為 60 個 1 秒的小窗口。每個小窗口都有獨立的請求計數。隨著時間推移,窗口像滑動門一樣逐步移動,舊的小窗口移出,新的小窗口移入。當請求到達時,不僅要判斷當前所在小窗口的請求計數,還要綜合考慮滑動窗口內所有小窗口的請求總數是否超過閾值。例如,1 分鐘的滑動窗口劃分為 60 個小窗口,限流閾值為 100。如果當前第 30 秒的小窗口內已有 5 個請求,而滑動窗口內累計請求數為 90,此時再有新請求到達,計算滑動窗口內(包含當前小窗口)的總請求數為 95,未超過 100,則允許請求通過。?

優點?

解決流量突刺問題:通過細分窗口和動態滑動,有效避免了固定窗口在窗口切換時可能出現的流量集中沖擊,使限流更加平滑。?
限流更精準:能夠對時間窗口內不同時刻的流量進行更細致的把控,更符合實際業務中流量分布不均勻的特點。?

缺點?

實現復雜度增加:需要維護多個小窗口的計數,以及處理窗口滑動的邏輯,代碼實現相對復雜。?
資源消耗增加:由于要記錄多個小窗口的狀態,占用的內存等系統資源比固定窗口更多,在大規模分布式系統中,資源開銷不容忽視。?

令牌桶限流方案?

實現方式?

令牌桶算法中,系統以固定的速率生成令牌并放入桶中。桶有固定的容量,當桶滿時,新生成的令牌會被丟棄。每個請求在通過限流時,需要從桶中獲取一個令牌。如果桶中有足夠的令牌,請求可以通過;若桶中沒有令牌,則請求被拒絕。例如,令牌生成速率為每秒 10 個,桶的容量為 100 個。系統會每秒向桶中添加 10 個令牌,當請求到來時,嘗試從桶中取一個令牌,若桶中有令牌則請求通過,若桶為空則請求被限流。?

優點?

允許一定程度的突發流量:因為桶可以預先積累一定數量的令牌,所以在短時間內,系統能夠處理比平均速率更高的流量,適應業務中偶爾出現的突發請求場景。?
限流規則靈活:通過調整令牌生成速率和桶的容量,可以輕松實現不同的限流策略,滿足多樣化的業務需求。?

缺點?

實現相對復雜:需要設計令牌生成、存儲以及獲取的機制,涉及到定時任務、數據結構等知識,開發難度較固定窗口有所提升。?
對令牌生成速率的設置要求較高:若令牌生成速率設置不合理,可能導致系統在高并發下無法有效限流或者資源利用不充分。?

漏斗限流方案?

實現方式?

漏斗算法類似于一個底部有小孔的漏斗,請求就像水一樣流入漏斗。漏斗以固定的速率將請求流出(處理請求),當漏斗中的請求數量超過漏斗的容量時,新流入的請求將被拒絕。例如,漏斗的容量為 50,流出速率為每秒 5 個請求。當請求不斷進入漏斗時,若漏斗內請求數未超過 50,請求按每秒 5 個的速率被處理;若漏斗已滿,再有新請求進入則被限流拒絕。?

優點?

流量處理平滑:能保證請求以固定的速率被處理,不會出現流量忽大忽小的情況,對于一些對流量穩定性要求較高的系統,如數據庫讀寫操作,能有效保護后端資源。?
實現相對簡單:相較于令牌桶,漏斗算法的邏輯更為直接,只需關注請求的流入、漏斗容量以及流出速率,易于理解和實現。?

缺點?

不支持突發流量:由于請求只能以固定速率流出,無法應對業務中突然出現的大量請求,可能導致在突發流量下大量請求被拒絕,影響用戶體驗。?
資源利用率較低:在流量低谷期,漏斗仍以固定速率處理請求,可能造成系統資源閑置,不能充分利用系統的處理能力。?
綜上所述,不同的分布式限流方案各有優劣。在實際應用中,開發者需要根據業務場景的特點,如流量特性(是否有突發流量、對流量穩定性要求等)、系統資源狀況、開發成本等因素,綜合權衡選擇最適合的限流方案,以保障分布式系統的穩定高效運行。

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

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

相關文章

WPS JS宏編程教程(從基礎到進階)-- 第三部分:JS宏編程語言開發基礎

第三部分:JS宏編程語言開發基礎 @[TOC](第三部分:JS宏編程語言開發基礎)**第三部分:JS宏編程語言開發基礎**1. 變量與數據類型**變量聲明:三種方式****示例代碼****數據類型判斷****實戰:動態處理單元格類型**2. 運算符全解析**算術運算符****易錯點:字符串拼接 vs 數值相…

Python - 爬蟲-網頁抓取數據-庫urllib

urllib庫是Python內置的HTTP請求庫。無需額外安裝,可以直接使用。urllib庫包含以下四個模塊。 urllib.request - 打開和讀取 URL。urllib.error - 包含 urllib.request 拋出的異常。urllib.parse - 解析 URL。urllib.robotparser - 解析 robots.txt 文件。 1、reque…

C++進階知識復習 1~15

C 進階總復習 (1~15) 目的1. 介紹下程序從編寫到可執行的整個過程2. C中的auto和decltype的區別3. 介紹下多態的實現原理4. C中的new[] 和delete[] 為什么一定要配對使用?5. C中malloc申請的內存 可以使用delete釋放嘛6. 什么情況下會出現內存…

輸電線路航空標志球:低空飛行的安全路標 / 恒峰智慧科技

在現代社會,隨著航空業的快速發展,低空飛行活動日益頻繁。為了確保飛行安全,避免飛機與高壓電線等障礙物發生碰撞,輸電線路航空標志球應運而生。這種裝置被廣泛應用于高壓輸電線路上,尤其是超高壓和跨江輸電線&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件詳解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件詳解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件詳解 在 Debian/Ubuntu 系統中,/etc/network/interfaces 是傳統網絡接口配置文件,用于定義網絡接口的靜態/動態配置。以下是逐項解…

OpenCV 圖形API(或稱G-API)(1)

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 引言 OpenCV 圖形API(或稱G-API)是一個新的OpenCV模塊,旨在使常規圖像處理更快且更便攜。通過引入一種新的基于圖的執行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路2. 代碼實現 題目鏈接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路 這一題大的思路上不難想到就是一個動態規劃的思路。我們分別…

win10之mysql server 8.0.41安裝

一 mysql server 下載 官網下載地址頁面 https://dev.mysql.com/downloads/mysql/二 免裝版使用步驟 1 解壓 下載完成后,解壓文件夾,如下所示: 2 執行安裝命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二屆藍橋杯省賽軟件類(cc++組)

第一題&#xff08;空間&#xff09; 解題思路 答案 #include <stdio.h>int main() {// 計算256MB對應的字節數&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每個32位二進制整數占4個字節&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移動語義

文章目錄 一、移動語義1、為什么需要移動語義&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何實現移動語義&#xff1f;——移動構造函數/賦值4、什么時候觸發移動&#xff1f;5、移動 vs 拷貝 一、移動語義 1、為什么需要移動語…

wsl下ubuntu安裝寶塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安裝寶塔面板的步驟如下&#xff1a; 1. 確保 WSL 環境正常 已安裝 WSL 2 并啟用 Ubuntu 發行版&#xff08;推薦 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中檢查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP網絡通信

UDP網絡通信&#xff1a; 步驟1 創建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);參數一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA節點探測是干什么用的?

想象一個大城市被劃分成幾個區&#xff08;比如東區、西區&#xff09;。每個區有自己的超市&#xff08;內存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本區的超市買東西最快&#xff0c;去其他區的超市會慢一些。 NUMA節點探測&#xff0c;就是Linux系統在…

使用 Less 實現 PC 和移動端樣式適配

&#x1f310; 使用 Less 實現 PC 和移動端樣式適配 —— 以 position 屬性為例 在前端開發中&#xff0c;我們常常會遇到這樣一個場景&#xff1a; 在 PC 頁面中需要某個元素是 position: relative;&#xff0c;但在移動端卻希望它是 position: inherit;&#xff0c;以便更靈…

企業戰略管理(設計與工程師類)-2-戰略規劃及管理過程-1-概述

戰略管理過程 參考資料&#xff1a; 戰略管理 - 清華大學- 蔡臨寧公司戰略與風險管理 - 華中科技大學 - 賀遠瓊戰略管理 - 北京理工大學 - 楊萬榮DeepSeek - 深度思考與聯網檢索 AFI框架 戰略管理最典型的就是采用傳統的AFI通用戰略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并發原理以及技術實現對比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架雖然都支持高并發&#xff0c;但它們的實現原理、底層機制和適用場景有顯著差異。以下從 高并發原理、技術實現區別、優缺點 三個方面詳細分析&#xff1a; 一、高并發實現原理 1. Hyperf (PHP Swoole) Hyperf 的高并發能力基于 Swoo…

【教程】如何利用bbbrisk一步一步實現評分卡

利用bbbrisk一步一步實現評分卡 一、什么是評分卡1.1.什么是評分卡1.2.評分卡有哪些 二、評分卡怎么弄出來的2.1.如何制作評分卡2.2.制作評分卡的流程 三、變量的分箱3.1.數據介紹3.2.變量自動分箱3.3.變量的篩選 四、構建評分卡4.1.評分卡實現代碼4.2.評分卡表4.3.閾值表與分數…

AI日報 - 2025年4月2日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL訓練可誘發模型頓悟&#xff0c;Anthropic發布Claude 3.5內部機制研究&#xff0c;簡化語言模型推理優化新方法提出。 DeepSeek-R1無需額外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 網絡穿透:如何從外部訪問 K8s Pod 地址

文章目錄 探索 Kubernetes 網絡穿透&#xff1a;如何從外部訪問 K8s Pod 地址為什么需要外部訪問 Pod 地址&#xff1f;常見的網絡穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;為開發調試提供便捷穿透 實踐建議與注意事項各方案對比表總…

深入理解 Apache Dagster:數據管道編排實戰指南

本文系統介紹了 Apache Dagster 的核心概念與實踐方法&#xff0c;涵蓋環境搭建、管道定義、運行調試及高級功能&#xff0c;幫助開發者快速掌握這一現代化數據編排工具&#xff0c;提升數據工程效率。 1. 背景與核心優勢 隨著數據驅動應用的復雜化&#xff0c;傳統工具在可維…