利用 Google Guava 的令牌桶限流實現數據處理限流控制

目錄

一、令牌桶限流機制原理

二、場景設計與目標

三、核心實現代碼(Java)

1. 完整代碼實現

四、運行效果分析

五、應用建議


在高吞吐數據處理場景中,如何限制數據處理速率、保護系統資源、防止下游服務過載是系統設計中重要的環節。本文將介紹一種簡單實用的限流方式 —— 基于 Google Guava 的令牌桶限流機制(Token Bucket),并通過實際代碼演示如何將其應用于數據處理任務中。

一、令牌桶限流機制原理

令牌桶算法(Token Bucket)是一種常見的流量控制算法。其基本原理如下:

  • 系統按照固定速率(如每秒 5 個)往桶中放入令牌;

  • 每次處理數據前,需要從桶中取出一個令牌;

  • 若桶中有令牌,則允許處理數據;

  • 若桶中無令牌,當前請求會被阻塞或丟棄(根據實現策略);

  • 桶容量可設定為最大突發請求數,支持短時間突發。

在 Google 的 Guava 庫中,RateLimiter 類就實現了一個基于令牌桶的限流器,它適用于:

  • 接口請求限速;

  • 后臺批處理速率控制;

  • 防止后端系統過載等場景。

二、場景設計與目標

我們構建一個數據處理系統,包含以下三個核心組件:

  1. 數據生成器線程:以較高頻率(每秒 2 條)不斷將數據放入隊列。

  2. 數據處理器線程:通過 RateLimiter 每秒只允許處理 1 條數據。

  3. 監控線程:每隔 2 秒打印隊列中積壓的數據數量,觀測限流效果。

三、核心實現代碼(Java)

使用 Guava 31+,Maven 依賴如下:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version>
</dependency>

1. 完整代碼實現

package google;
?
import com.google.common.util.concurrent.RateLimiter;
?
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
?
public class TokenBucketDataProcessor {
?// 每秒最多處理5個數據private static final RateLimiter rateLimiter = RateLimiter.create(1);
?// 模擬數據管道private static final BlockingQueue<String> queue = new LinkedBlockingQueue<>();
?public static void main(String[] args) {
?// 線程1:數據生成線程,每秒生成2條數據Thread producer = new Thread(() -> {int i = 0;while (true) {try {Thread.sleep(500); // 每100ms生成1條數據 -> 每秒10條String data = "data-" + (i++);queue.put(data);System.out.println("[Producer] Generated: " + data);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}});
?// 線程2:數據處理線程,受RateLimiter限流影響Thread consumer = new Thread(() -> {while (true) {try {rateLimiter.acquire(1); // 阻塞直到拿到令牌String data = queue.take(); // 取數據System.out.println("[Consumer] Processed: " + data);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}});
?// 線程3:監控線程,每2秒輸出積壓情況Thread monitor = new Thread(() -> {while (true) {try {Thread.sleep(2000);System.out.println("[Monitor] Queue size: " + queue.size());} catch (InterruptedException e) {Thread.currentThread().interrupt();}}});
?producer.start();consumer.start();monitor.setDaemon(true); // 守護線程monitor.start();}
}

四、運行效果分析

預期輸出如下:

[Producer] Generated: data-0
[Consumer] Processed: data-0
[Producer] Generated: data-1
[Consumer] Processed: data-1
[Producer] Generated: data-2
[Consumer] Processed: data-2
[Monitor] Queue size: 0
[Producer] Generated: data-3
[Producer] Generated: data-4
[Consumer] Processed: data-3
[Producer] Generated: data-5
[Producer] Generated: data-6
[Consumer] Processed: data-4
[Monitor] Queue size: 2
[Producer] Generated: data-7
[Producer] Generated: data-8
[Consumer] Processed: data-5
[Producer] Generated: data-9
[Producer] Generated: data-10
[Consumer] Processed: data-6
[Monitor] Queue size: 4
[Producer] Generated: data-11
[Producer] Generated: data-12
[Consumer] Processed: data-7
[Producer] Generated: data-13
[Producer] Generated: data-14
[Consumer] Processed: data-8
[Monitor] Queue size: 6
... ...

從輸出中可以看到:

  • 數據生產速度 > 數據處理速度;

  • queue.size() 會逐步增長,表明數據被限流處理;

  • RateLimiter.acquire() 自動阻塞了處理線程,使得處理速度不超過 2 qps;

  • 限流處理過程對系統其他線程無影響,靈活、安全、無鎖。

五、應用建議

在需要處理數據流或消息流的系統中,控制處理速率是一項必要手段:

  • Guava 的 RateLimiter 實現了高效、線程安全、非阻塞或阻塞可控的令牌桶限流機制;

  • 利用其 acquire() 阻塞等待機制,我們可以方便地將限流邏輯嵌入處理線程中;

  • 搭配 BlockingQueue 和監控線程,我們可以直觀觀察限流效果,并對系統做動態調優;

  • 適用場景包括但不限于:

    • Kafka 消費處理限流

    • 多線程數據清洗任務控制速率

    • 日志寫入、數據庫插入頻率控制

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

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

相關文章

小黑課堂計算機二級 WPS Office題庫安裝包2.52_Win中文_計算機二級考試_安裝教程

軟件下載 【名稱】&#xff1a;小黑課堂計算機二級 WPS Office題庫安裝包2.52 【大小】&#xff1a;584M 【語言】&#xff1a;簡體中文 【安裝環境】&#xff1a;Win10/Win11&#xff08;其他系統不清楚&#xff09; 【迅雷網盤下載鏈接】&#xff08;務必手機注冊&#…

CSS3知識補充

1.偽類和偽元素&#xff1a; 簡單的偽類實例 :first-chlid :last-child :only-child :invalid 用戶行為偽類 :hover——上面提到過&#xff0c;只會在用戶將指針挪到元素上的時候才會激活&#xff0c;一般就是鏈接元素。:focus——只會在用戶使用鍵盤控制&#xff0c;選…

Spring Retry 異常重試機制:從入門到生產實踐

Spring Retry 異常重試機制&#xff1a;從入門到生產實踐 適用版本&#xff1a;Spring Boot 3.x spring-retry 2.x 本文覆蓋 注解聲明式、RetryTemplate 編程式、監聽器、最佳實踐 與 避坑清單&#xff0c;可直接落地生產。 一、核心坐標 <!-- Spring Boot Starter 已經幫…

VTK交互——CallData

0. 概要 這段代碼https://examples.vtk.org/site/Cxx/Interaction/CallData/是一個使用VTK(Visualization Toolkit)庫的示例程序,主要演示了自定義事件、回調函數和定時器的使用。程序創建一個旋轉球體場景,并通過定時器觸發自定義事件來更新計數器。以下是詳細解釋: 1.…

OCR工具集下載與保姆級安裝教程!!

軟件下載 軟件名稱&#xff1a;OCR工具集1.1 軟件語言&#xff1a;簡體中文 軟件大小&#xff1a;78.8M 系統要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系統 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 盤丨下載&#xff1a;https://tool.nineya…

平時遇到的錯誤碼及場景?404?400?502?都是什么場景下什么含義,該怎么做 ?

? 一、常見 HTTP 錯誤碼及含義狀態碼含義簡述類型400Bad Request&#xff1a;請求格式有誤客戶端錯誤401Unauthorized&#xff1a;未授權客戶端錯誤403Forbidden&#xff1a;禁止訪問客戶端錯誤404Not Found&#xff1a;資源不存在客戶端錯誤405Method Not Allowed&#xff1a…

基于Tornado的WebSocket實時聊天系統:從零到一構建與解析

引言 在當今互聯網應用中&#xff0c;實時通信已成為不可或缺的一部分。無論是社交媒體、在線游戲還是協同辦公&#xff0c;用戶都期待即時、流暢的交互體驗。傳統的HTTP協議是無狀態的、單向的請求-響應模式&#xff0c;客戶端發起請求&#xff0c;服務器返回響應&#xff0c…

【語義分割】記錄2:yolo系列

圖像分割筆記1、源碼下載2、數據獲取3、環境配置4、模型訓練5、模型推理6、模型部署6.1 yolov5_flask學習7、版本上傳1、源碼下載 git clone https://github.com/ultralytics/ultralytics.gitgit回到對應版本&#xff1a; 方式一&#xff1a;使用 git checkout&#xff08;臨…

ubuntu22.04系統 算力4090服務器 病毒防護 查殺等 運維入門(三)clamAV工具離線查殺

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了&#xff0c;可以私信我獲取最新兌換碼&#xff01;&a…

微信小程序文件下載與預覽功能實現詳解

在微信小程序開發中&#xff0c;文件處理是常見需求&#xff0c;尤其是涉及合同、文檔等場景。本文將通過一個實際案例&#xff0c;詳細講解如何實現文件的下載、解壓、列表展示及預覽功能。 功能概述 該頁面主要實現了以下核心功能&#xff1a; 列表展示可下載的文件信息支持 …

postgresql執行創建和刪除時遇到的問題

刪除數據庫的時候出現的問題 有連接在占用 postgres=# DROP DATABASE "subgraph-dev"; ERROR: database "subgraph-dev" is being accessed by other users DETAIL: There is 1 other session using the database.強制斷開在用的連接 -- 替換 subgraph…

linux 應用層直接操作GPIO的方法

了解&#xff01;你使用的是 Rockchip RK3588S 平臺&#xff0c;需要操作 GPIO3_D5_d 這個引腳&#xff08;即 MCU_JTAG_TMS_M1/.../GPIO3_D5_d&#xff09;。以下是基于你提供的系統信息的具體操作步驟&#xff1a;&#x1f50d; 第一步&#xff1a;確認 GPIO 系統編號 在 RK3…

JavaScript核心概念全解析

目錄 1. 作用域 (1) 局部作用域 (2) 全局作用域 2. 垃圾回收 (1) 引用計數法 (2) 標記清除法 3. 閉包 (1) 作用 (2) 風險 4. 變量提升 (1) var (2) let 和 const (3) const 5. 函數提升 (1) 函數聲明 (2) 函數表達式 6. 函數參數 (1) 動態參數 (2) 剩余參數…

力扣刷題(第一百天)

靈感來源 - 保持更新&#xff0c;努力學習- python腳本學習提莫攻擊解題思路初始化總中毒時間 total。遍歷每次攻擊的時間點&#xff08;從第二個開始&#xff09;&#xff1a;計算當前攻擊與前一次攻擊的時間間隔 gap。若 gap < duration&#xff0c;則本次中毒時間為 gap&…

JMeter 性能測試實戰筆記

JMeter 性能測試實戰筆記 本文檔是一份詳細的 JMeter 指南&#xff0c;涵蓋了從創建測試計劃、執行測試到解讀性能結果的全過程。 一、創建測試計劃 一個完整的測試計劃是執行性能測試的基礎。下面將分步介紹如何創建一個針對文件上傳接口的測試場景。 第一步&#xff1a;添加線…

圖像處理:第二篇 —— 選擇鏡頭的基礎知識及對圖像處理的影響

一、圖像傳感器的典型應用圖像處理過程大致可分為如下四步&#xff1a;1.拍 攝 按下快門&#xff0c;拍攝圖像2.傳 送 將圖像數據由照相機傳送到控制器。3.處 理 前處理 : 對于圖像數據進行加工&#xff0c;使其特征更加明顯。測算處理 : 根據圖像數據對于損…

Linux 系統文件夾結構及用途說明

Linux 系統采用樹形文件結構&#xff0c;每個目錄都有明確的功能定位&#xff0c;遵循 FHS&#xff08;Filesystem Hierarchy Standard&#xff09; 標準。以下是新安裝系統后主要文件夾的用途&#xff1a;一、根目錄&#xff08;/&#xff09;核心文件夾1. /bin&#xff1a;基…

[spring6: HttpSecurity]-全新寫法

HttpSecurity HttpSecurity 是 Spring Security 中用于配置基于 HTTP 請求的安全策略的核心構建器&#xff0c;支持細粒度控制請求授權、認證、登錄、登出、CSRF、CORS、會話管理等安全功能。 package xyz.idoly.demo;import org.springframework.context.annotation.Bean; imp…

MIPI DSI 轉 1LVDS ,分辨率1920*1080.

一款橋接芯片&#xff0c;它接收 MP DSI 輸入并發送 LVDS 輸出。MlPI DSI 支持至多 4 條通道&#xff0c;每條通道的最大傳輸速率為 1Gbps&#xff0c;總的最大輸入帶寬為 4Gbps&#xff0c;并且還支持 MlPI 定義的 ULPS&#xff08;超低功耗狀態&#xff09;。LVDS 輸出采用 V…

墨者:SQL手工注入漏洞測試(MySQL數據庫)

一、SQL手工注入漏洞測試(MySQL數據庫) 本文以墨者學院靶場為例&#xff0c;演示MySQL數據庫的手工SQL注入全過程。靶場以自己的地址為準&#xff1a;http://124.70.64.48:47777/new_list.php?id1 二、注入原理與流程&#xff08;如下指令去掉了id之前的內容&#xff09; M…