令牌桶算法理解學習(限流算法)

令牌桶算法是網絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,并允許突發數據的發送。

用簡單的話語來說就是限制流量,將其控制到某一平均值穩定輸出,并可以在短時間內應對高額流量(短時高速率流量)的一種方法。

需要注意的是,限速只是讓他盡可能速率一致,是存在速率不穩定的情況的,只有在長期來看速率才是恒定的,而當令牌桶應對突發流量時會進行令牌桶內令牌的小號,理論上的峰值速率=令牌桶的容量+恒定速率,舉個例子,令牌桶的容量 為100MB,限制的速率為10MB/s,峰值速率則可以達到100+10=110MB/s。

?

?b為桶的容量,r為單位時間內放入的令牌數量,以下圖為例:

在r=10,b=5時,即表明每1/r=0.1,每0.1秒投入一個令牌,而在到0.5秒時達到桶的極限容量5,在此刻繼續投入令牌則無法維持,這些令牌將會被廢棄,同時在此時若有5個指令同時想要去走令牌則可以同時取走令牌桶內的所有令牌,即為取走b=5個。

注意

  1. 當b>1時(桶的大小大于1個令牌時),任意1/r秒內最多可以取走b個令牌;
  2. 而當b=1時(桶的大小就是1),每秒鐘最多可以被取走r個令牌。

綜上,令牌桶算法的總體流程大致分為如下三步:

  1. 將令牌放入桶內:按照固定的速率放入令牌桶內,例如r=10,20,100等;
  2. 獲取令牌:任意請求只有在取得可用令牌才會被接收處理;
  3. 令牌桶已滿:當桶內令牌已滿時,新加入的令牌會被丟棄或者拒絕接收。

與網絡帶寬分配相結合,可在一定程度上減少資源的浪費,同時可以根據不同優先級的業務來進行基于令牌桶的帶寬分配改進方式,針對不同優先級的業務設定不同的業務權值,以此來自適應業務速率的變化,可通過業務權值的占用比例進行動態分配令牌資源,利用令牌桶嵌入漏桶機制實現對業務占用的帶寬進行二次分配,根據業務優先級的高低對溢出的令牌實現依次填充,從而減少資源浪費。(源自論文:基于動態令牌桶的衛星網絡帶寬分配方法)

衛星網絡模型:一個GEO衛星,若干地面終端和網絡控制中心NCC(Network Control Center)組成,地面終端則是經由SG(Satallite Gateway)連接到Internet網絡。通過網絡控制中心NCC來進行處理各個SG發來的帶寬申請和分配新的貸款,上行鏈路由各個SG提供,下行鏈路則是數據流共享的信道。

GEO衛星網絡?

令牌桶方法實現:令牌桶的填充速率R,令牌桶容量S(令牌桶所能容納的最大令牌數),令牌桶的當前狀態為x,表示當前對應令牌桶的深度,工作流程如下圖:

工作流程上,GEO衛星上的帶寬資源被定義為n個令牌桶,當有業務傳達到時,NCC處理由SG為每個業務發送的帶寬請求并為其分配帶寬,哥哥令牌桶為每個業務分配基本保證帶寬,即為R1,R2,R3......Rn。調整R1,R2,R3......Rn的大小可以設定各個業務的保證帶寬,需要注意,各個令牌桶的尺寸小于鏈路的信道容量,各個業務到達相應令牌桶后,根據數據包長度與令牌桶內數量來進行分配,若數據包長度小于令牌數,業務傳送出去,令牌桶內令牌相應減少。而高優先級的業務將會優先進行放入。而由于令牌桶間仙姑獨立,令牌桶無法動態借用空閑令牌,即空閑帶寬無法進行有效利用,且令牌桶在填充過程中,令牌個數不會大于令牌桶容量,溢出令牌會丟失,也進一步造成了帶寬資源的浪費

改進方法:將漏桶嵌入到令牌桶中,即每一個令牌桶連接一個漏桶,有幾個優先級就有幾個令牌桶。這樣可以保證優先級為n的最小帶寬,溢出桶用來存儲溢出的令牌,借用令牌桶的動態帶寬分配算法(Dynamic Bandwidth Allocation Algorithm with Token Bucket,DBAATB),原理下圖:

?代碼實現

acquire獲取令牌的操作中,使用鎖保護數據正確性,使用條件等待令牌足夠才繼續往下執行。

bool CountSemaphore::acquire(unsigned long long count)
{std::unique_lock<std::mutex> lck(m_mtx);if (count > m_maxCount){return false;}m_cv.wait(lck, [&]() -> bool { return m_updateCount >= count; });m_updateCount -= count;return true;
}

release增加令牌數量,并通知其他等待條件的線程繼續執行。

void CountSemaphore::release(unsigned long long count){std::unique_lock<std::mutex> lck(m_mtx);auto tobeCount = m_updateCount + count;if (tobeCount > m_maxCount){m_updateCount = m_maxCount;}else{m_updateCount = tobeCount;}m_cv.notify_all();
}

TokenSpeedLimiter是令牌桶的封裝。包含令牌桶的限速速度,令牌的投遞時間間隔和令牌桶的容量。提供開始和結束投遞操作和獲取令牌的操作。

void TokenSpeedLimiter::workingThread()
{auto lastTime = std::chrono::steady_clock::now();while (m_runing){// 延時定時投遞std::this_thread::sleep_for(std::chrono::milliseconds(m_deliveryIntervalMs));// 計算投遞時間差auto curTime = std::chrono::steady_clock::now();auto elapsedMs = std::chrono::duration<double, std::milli>(curTime - lastTime).count();lastTime = curTime;// 根據時間差計算投遞令牌的數量(除以1000換算成毫秒投遞數量,然后再乘以毫秒時間差)auto tokens = m_limitSpeed * elapsedMs / 1000;// 投遞令牌m_semaphore.release((unsigned long long)tokens);}
}

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

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

相關文章

Vscode中配置SSH

方法&#xff1a; 本地生成秘鑰&#xff0c;并將生成的秘鑰保存在服務器上 步驟&#xff1a; 一、用戶端生成秘鑰 1、在cmd中輸入ssh-keygen -t rsa&#xff0c;一直點回車即可 2、打開生成的秘鑰文件&#xff08;位置&#xff1a;C:\Users\用戶名\.ssh\id_rsa.pub&#x…

【Java】BigInteger用法

前言 在Java中&#xff0c;由于沒有long long類型。如果需要使用比long類型更大的整數數據時&#xff0c;就可以使用BigInteger類&#xff0c;它支持任意精度的整數。 創建BigInteger類型數據 Test public void test1() {Scanner scan new Scanner(System.in);//1.控制臺讀…

leetcode做題筆記2048. 下一個更大的數值平衡數

如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數 。 示例 1&#xff1a; 輸入&#xff1a;n 1 輸出&#xff1a;22 解釋&a…

Linux中的SNAT與DNAT實踐

Linux中的SNAT與DNAT實踐 1、SNAT的介紹1.1&#xff0c;SNAT概述1.2&#xff0c;SNAT源地址轉換過程1.3&#xff0c;SNAT轉換 2、DNAT的介紹2.1&#xff0c;DNAT概述2.2&#xff0c;DNAT轉換前提條件2.3&#xff0c;DNAT的轉換 3、防火墻規則的備份和還原4、tcpdump抓包工具的運…

騰訊再推互動微短劇,游戲的風吹向了短劇

當你看劇時不再擁有上帝視角&#xff0c;處在女主的位置上&#xff0c;你又會做出什么樣的選擇&#xff1f; 騰訊最新上線的短劇《摩玉玄奇2》在原版之外還推出了互動版&#xff0c;就給出了這樣一個新玩法。 《摩玉玄奇2》原版是普通的后宮職場微短劇&#xff0c;互動版則是…

虛擬機VMware安裝centos以及配置網絡

目錄 1、CentOS7的下載2、CentOS7的配置3、CentOS7的安裝4、CentOS7的網絡配置 4.1、自動獲取IP4.2、固定獲取IP 5、XShell連接CentO 準備工作&#xff1a;提前下載和安裝好VMware。VMware的安裝可以參考這一篇文章&#xff1a;VMware15的下載及安裝教程。 1、CentOS7的下載 …

qt 字符串操作

在 QT 中&#xff0c;你可以使用QString類來操作字符串。QString是一個模板類&#xff0c;它可以存儲不同字符集的字符串&#xff0c;并且提供了許多用于操作字符串的方法。 以下是一些常見的操作字符串的方法&#xff1a; append()方法&#xff1a;將一個字符串附加到QString的…

從零開始搭建企業管理系統(五):統一響應結果和全局異常處理

統一響應結果和全局異常處理 前言統一響應結果定義響應結構定義響應對象定義響應狀態對象統一返回響應對象定義 Controller 攔截類 全局異常處理 前言 做個功能之前我們想一下為什么要做統一響應結果和全局異常處理呢&#xff1f; 這是因為我們的項目采用的是前后端分離開發&am…

【C++】小項目:C++實現通訊錄管理系統

文章目錄 1、系統需求完整代碼 1、系統需求 本文將利用C來實現一個通訊錄管理系統 系統中需要實現的功能如下&#xff1a; 添加聯系人&#xff1a;向通訊錄中添加新人&#xff0c;信息包括&#xff08;姓名、性別、年齡、聯系電話、家庭住址&#xff09;最多記錄1000人顯示聯…

LVGL | Demo實例使用說明

LVGL | Demo實例使用說明 時間&#xff1a;2023年12月10日21:51:17 文章目錄 LVGL | Demo實例使用說明Demos for LVGLAdd the examples to your projectsDemosWidgetsMusic playerKeypad and encoderBenchmarkStress Contributing Demos for LVGL Add the examples to your p…

基于SSM的酒店管理旅店系統(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

華為OD機試真題-密碼輸入檢測-2023年OD統一考試(C卷)

題目描述&#xff1a; 給定用戶密碼輸入流input&#xff0c;輸入流中字符<表示退格&#xff0c;可以清除前一個輸入的字符&#xff0c;請你編寫程序&#xff0c;輸出最終得到的密碼字符&#xff0c;并判斷密碼是否滿足如下的密碼安全要求。 密碼安全要求如下&#xff1a; …

【軟件測試】年薪30萬跟年薪15萬的面試有些什么區別?

1、什么是兼容性測試&#xff1f;兼容性測試側重哪些方面&#xff1f; 參考答案&#xff1a; 兼容測試主要是檢查軟件在不同的硬件平臺、軟件平臺上是否可以正常的運行&#xff0c;即是通常說的軟件的可移植性。 兼容的類型&#xff0c;如果細分的話&#xff0c;有平臺的兼容…

7記一次組網過程

這段時間學習了服務器、操作系統、網絡相關的知識&#xff0c;后面真的進行了一次組網操作。這次把組網的過程記錄下來&#xff0c;方便下次操作的時候有資料可查詢。 前期準備 要組網&#xff0c;首先要做好規劃&#xff0c;把前期要準備的事情提前做好&#xff0c;才能事半…

Numpy數組中數據的排序【sort(),argsort()與 lexsort()】 (第13講)

Numpy數組中數據的排序【sort(),argsort()與 lexsort()】 (第13講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ???????????????????????????????????????????????????????????????????…

【C++ 程序設計入門基礎】- 第3節-循環結構02

目錄 while 語句 案例 while 循環 輸入一個整數 n &#xff0c;輸出 1~n 的所有整數。 查看運行結果&#xff1a; while 語句結構解析 do while 語句 案例 do while 循環 輸入一個整數n&#xff0c;輸出1&#xff5e;n的所有整數。 查看運行結果 while、do while的區別 …

AE-制作唯美星空粒子動態視頻

目錄 1.新建合成 2.導入一張星空圖片,拖入到新建的合成中 3.新建純色層面命名為bj

【git 相關操作】

git status - 查看當前狀態 git add - 將文件添加到暫存區 git commit -m "msg" - 提交暫存區文件到本地倉庫 git push origin master - 本地倉庫文件推送到遠程倉庫 git merge - 合并分支 git clone - 從指定地址克隆項目 git log - 查看commit日志 git stash push …

SpringSecurity6 | 登錄成功后的JSON處理

?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客 &#x1f49e;當前專欄&#xff1a; Java從入門到精通 ?特色專欄&#xf…

Android:java.lang.SecurityException: Provider must not be exporte

java.lang.SecurityException: Provider must not be exporte 解決方案 首先在AndroidManifest.xml中添加provider android:authorities&#xff1a; 是用來標識provider的唯一標識&#xff0c;在同一部手機上一個"authority"串只能被一個app使用&#xff0c;沖突的話…