服務限流算法:從令人頭疼到信手拈來

前言

隨著系統規模的擴大和用戶量的增加,服務限流成為了一個非常重要的話題。一方面,系統需要能夠處理大量的請求,不至于因為負載過高而崩潰;另一方面,又需要避免惡意攻擊或者其他異常情況對系統造成影響。本文將介紹一些常見的服務限流算法,包括漏桶算法、令牌桶算法、計數器算法等,并提供Java實現示例,幫助讀者更好地理解這些算法。

漏桶算法

算法原理

漏桶算法是一種最簡單的限流算法。它的基本思想是,將請求看作是水流,服務則是下面的水桶。當請求進來時,先放到容量固定的漏桶中,然后以一定的速度流出。如果漏桶已經滿了,那么新的請求就會被丟棄。這個速度可以是固定的,也可以是動態的,與具體實現有關。

漏桶算法可以有效平滑流量,控制請求處理的速度。

Java實現

public class LeakyBucket {private final int capacity; // 漏桶容量private final int ratePerSecond; // 水流出的速度(每秒)private int waterLevel = 0; // 桶中當前水位private long lastUpdateTime = System.currentTimeMillis(); // 上次更新時間public LeakyBucket(int capacity, int ratePerSecond) {this.capacity = capacity;this.ratePerSecond = ratePerSecond;}public synchronized boolean allowRequest() {// 計算時間差,更新漏桶中的水量long timePassed = System.currentTimeMillis() - lastUpdateTime;int waterDrained = (int) (timePassed / 1000 * ratePerSecond);waterLevel = Math.max(0, waterLevel - waterDrained);lastUpdateTime = System.currentTimeMillis();// 判斷漏桶中的水量是否超過容量,如果超過則拒絕請求if (waterLevel >= capacity) {return false;} else {waterLevel++;return true;}}
}

漏桶算法的Java實現非常簡單,只需要記錄漏桶的容量和速度,并在處理請求時更新漏桶中的水位即可。在上述示例中,使用synchronized關鍵字確保線程安全。

令牌桶算法

算法原理

令牌桶算法也是一種常見的限流算法。它的基本思想是,系統以一定的速度生成令牌并放入桶中,請求需要從桶中取出令牌才能被處理。如果桶中沒有令牌,則請求不能被處理。這個速度可以是固定的,也可以是動態的,與具體實現有關。

令牌桶算法可以控制請求處理的速率,同時還可以應對短時間內的請求突發。

Java實現

public class TokenBucket {private final int capacity; // 令牌桶容量private final int ratePerSecond; // 令牌生成速度(每秒)private int tokenCount = 0; // 桶中當前令牌數private long lastUpdateTime = System.currentTimeMillis(); // 上次更新時間public TokenBucket(int capacity, int ratePerSecond) {this.capacity = capacity;this.ratePerSecond = ratePerSecond;}public synchronized boolean allowRequest() {// 計算時間差,更新桶中的令牌數long timePassed = System.currentTimeMillis() - lastUpdateTime;int tokensToAdd = (int) (timePassed / 1000 * ratePerSecond);tokenCount = Math.min(capacity, tokenCount + tokensToAdd);lastUpdateTime = System.currentTimeMillis();// 判斷令牌數是否足夠,如果足夠則允許請求if (tokenCount > 0) {tokenCount--;return true;} else {return false;}}
}

令牌桶算法的Java實現與漏桶算法類似,只需要記錄令牌桶的容量和速度,并在處理請求時更新桶中的令牌數即可。在上述示例中,使用synchronized關鍵字確保線程安全。

計數器算法

算法原理

計數器算法是一種基于時間窗口的限流算法。它的基本思想是,用一個定長的時間窗口來統計請求次數,當請求次數超過閾值時,則拒絕新的請求。這個時間窗口可以是固定的,也可以是動態的,與具體實現有關。

Java實現

public class Counter {private final int maxRequests; // 時間窗口內最大請求數private final long timeWindowInMillis; // 時間窗口長度(毫秒)private final Queue<Long> requestTimes = new LinkedList<>(); // 請求時間隊列public Counter(int maxRequests, long timeWindowInMillis) {this.maxRequests = maxRequests;this.timeWindowInMillis = timeWindowInMillis;}public synchronized boolean allowRequest() {// 移除過期的請求時間long currentTime = System.currentTimeMillis();while (!requestTimes.isEmpty() && requestTimes.peek() < currentTime - timeWindowInMillis) {requestTimes.poll();}// 判斷請求數是否達到閾值if (requestTimes.size() < maxRequests) {requestTimes.offer(currentTime);return true;} else {return false;}}
}

計數器算法的Java實現需要使用一個隊列來存儲請求時間,并在處理請求時動態地移除過期的請求時間。在上述示例中,使用synchronized關鍵字確保線程安全。

總結

本文介紹了三種常見的服務限流算法,漏桶算法、令牌桶算法和計數器算法,以及它們在Java中的實現。這些算法在實際應用中都有自己的優缺點,大家可以根據具體需求選擇合適的算法。同時,也可以結合多種算法,形成更加嚴謹、可靠的限流策略。

👉 💐🌸?公眾號請關注 "果醬桑", 一起學習,一起進步!?🌸💐

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

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

相關文章

npm相關和私有云

安裝node時npm會自動安裝&#xff0c;npm也可以單獨安裝。 package.json 在使用npm時&#xff0c;package.json文件是非常重要的&#xff0c;因為它包含了關于項目的必要信息&#xff0c;比如名稱、版本、依賴項等。在初始化新項目時&#xff0c;通常會使用npm init命令生成一…

pip安裝python包到指定python版本下

python -m pip install 包名1.命令行進入到指定python安裝目錄。比如我電腦上有python3.8也有python3.9。準備給python3.9安裝指定的包

【青書學堂】 2023年第二學期 HTML5+CSS3(直播課) 作業

【青書學堂】 2023年第二學期 HTML5CSS3(直播課) 作業 為了方便日后復習&#xff0c;青書學堂成人大專試題整理。 若有未整理的課程&#xff0c;請私信我補充&#xff0c;歡迎愛學習的同學們收藏點贊關注&#xff01;文章內容僅限學習使用&#xff01;&#xff01;&#xff01;…

3.OpenFeign的使用

OpenFeign 文章目錄 OpenFeign一. 什么是OpenFeign二. OpenFeign基礎使用1.添加依賴2.配置Nacos配置信息3.在項目中開啟OpenFeign4.編寫OpenFeign調用代碼5.調用OpenFeign接口 三. OpenFeign內置的超時重試機制1.配置超時重試2.覆蓋Retryer對象 四.自定義超時重試機制1.自定義超…

Hive中常出現的錯誤(不定時更新)

1.加載數據失敗 hive> load data local inpath /home/user/hive.txt into table studentl> ; FAILED: SemanticException [Error 10001]: Line 1:56 Table not found studentl hive> load data local inpath /home/user/hive.txt into table student; Loading data to…

技術分享| anyRTC之RTN網絡

RTN(Real-time Network)中文名&#xff1a;實時音視頻傳輸網絡。 RTN是最近幾年由各大RTC的云廠商提出的一個全新架構的音視頻實時傳輸網絡概念。類似于直播的CDN網絡&#xff0c;RTN是對音視頻的實時性又強烈要求的場景而設計的&#xff0c;原理上全球端到端的時延通過RTN網絡…

JSP EL表達式獲取list/Map集合與java Bean對象

上文 JSP EL表達式基本使用 中 我們對EL表達式做了一個基本的了解 也做了基礎的字符串數據使用 那么 我們可以來看一下我們的集合 首先 list 這個比較簡單 我們直接這樣寫代碼 <% page import"java.util.ArrayList" %> <% page import"java.util.Lis…

基于C#實現優先隊列

一、堆結構 1.1性質 堆是一種很松散的序結構樹&#xff0c;只保存了父節點和孩子節點的大小關系&#xff0c;并不規定左右孩子的大小&#xff0c;不像排序樹那樣嚴格&#xff0c;又因為堆是一種完全二叉樹&#xff0c;設節點為 i,則 i/2 是 i 的父節點&#xff0c;2i 是 i 的…

安卓開發之HTTP API服務接口設計(基于okhttp3請求)

安卓中的請求 OkHttp3 是一個開源的 Java/Android HTTP 客戶端庫,由 Square 公司開發。它提供了簡潔和高效 的 API ,用于進行 HTTP 請求、處理響應以及與服務器進行通信。 以下是 OkHttp3 的一些主要特點和功能: 簡單易用: OkHttp3 提供了簡潔的 API ,使得發送 HTTP 請求變…

信息系統的安全保護等級的五個級別

信息系統的安全保護等級分為五級&#xff1a;第一級為自主保護級、第二級為指導保護級、第三級為監督保護級、第四級為強制保護級、第五級為專控保護級。 法律依據&#xff1a;《信息安全等級保護管理辦法》第四條 信息系統的安全保護等級分為以下五級&#xff1a;   &#…

【C語言】計算實時太陽角度(高度角、方位角),以及使用stm32單片機實時獲取時間戳

整體計算方法 在編寫該代碼的過程中尋找了多篇博文和論文&#xff0c;綜合所有文章且按網上的以0時的方位角的0&#xff0c;且隨時間累加累加至360度。我修改了博文和論文的一些角度的計算方法。得到一下代碼與網站計算的方位角相互驗證過&#xff0c;誤差不超過1 驗證網站 太…

LoRaWAN 中國地區文件詳細解讀

目錄 一、LoRaWAN簡介 二、CN470-510地區參數分析 1.信道頻率 2.支持功率 3.支持空速 4.最大負載大小 5.接受窗口參數 三、CN470_510默認參數 Lora LoraWAN教程 一、LoRaWAN簡介 LoraWAN是一種基于LoRa遠距離通信技術配套設計的一套通訊協議和系統架構。LoRaWAN網絡通…

Java實現拼圖游戲

1、了解拼圖游戲基本功能&#xff1a; 拼圖游戲內容由若干小圖像塊組成的&#xff0c;通過鼠標點擊圖像塊上下左右移動&#xff0c;完成圖像的拼湊。 2、拼圖游戲交互界面設計與開發&#xff1a; 通過創建窗體類、菜單、中間面板和左右面板完成設計拼圖的交互界面 &#xff…

外貿自建站服務器怎么選?網站搭建的工具?

外貿自建站服務器用哪個好&#xff1f;如何選海洋建站的服務器&#xff1f; 外貿自建站是企業拓展海外市場的重要手段之一。而在這個過程中&#xff0c;選擇一個適合的服務器對于網站的穩定運行和優化至關重要。海洋建站將為您介紹如何選擇適合的外貿自建站服務器。 外貿自建…

CSDN如何完整轉載別人的文章并做自己的筆記

1、這篇文章介紹主體的轉載&#xff08;粘貼&#xff09;方法&#xff1a; 轉載&#xff1a;CSDN快速轉載文章方法&#xff08;簡單&#xff09;_csdn轉載_biggolden1的博客-CSDN博客 2、這篇文章解決&#xff0c;對于含有代碼塊的文章粘貼后&#xff0c;出現的額外行號塊問題…

【STM32外設系列】GPS定位模塊(ATGM336H)

&#x1f380; 文章作者&#xff1a;二土電子 &#x1f338; 關注公眾號獲取更多資料&#xff01; &#x1f438; 期待大家一起學習交流&#xff01; 文章目錄 一、GPS模塊簡介二、使用方法2.1 引腳介紹2.2 數據幀介紹2.3 關于不同的啟動方式 三、前置知識3.1 strstr函數3.2…

DevSecOps 的未來

采用 可以做的事情還有很多。您編碼和構建的內容是您看到嵌入 CI/CD 管道的大部分進展的地方。隨著世界在不同的云環境中變得更加由 API 驅動&#xff0c;我們將考慮如何將安全角度嵌入到所有這些事物中&#xff0c;無論平臺如何構建。這是一個涉及人員的工作流程。您做得越多&…

基于H1ve一分鐘搭好CTF靶場

寫在前面 ? ? ? 上一篇文章給大家詳細介紹了基于H1ve搭建CTF靶場&#xff0c;以及過程中可能遇到的報錯及解決方法&#xff0c;那么這篇文章&#xff0c;我總結了一下&#xff0c;將不會遇到報錯的方法給到大家&#xff0c;但是前提是你的服務器最好是一個全新的哦~~~ 我…

Qt框架學習(1)

1.安裝Qt官網 2.Qt中的快捷鍵 快捷鍵解釋F4頭文件和實現文件切換ShiftF2變量:跳轉到聲明;函數:跳轉到定義;F5調試程序F3查找下一個CtrlShiftR修改所有選中的名稱F10單步(略過)調試,執行當前程序語句F11單步(跟蹤)調試,如果有函數則進入函數F9設置\取消斷點CtrlShiftS保存所有文…

C++基礎從0到1入門編程(四)類和對象

系統學習C 方便自己日后復習&#xff0c;錯誤的地方希望積極指正 往期文章&#xff1a; C基礎從0到1入門編程&#xff08;一&#xff09; C基礎從0到1入門編程&#xff08;二&#xff09; C基礎從0到1入門編程&#xff08;三&#xff09; 參考視頻&#xff1a; 1.黑馬程序員匠心…