令牌桶算法理解学习(限流算法)

news2024/11/26 14:28:17

令牌桶算法是网络流量整形(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.coloradmin.cn/o/1301031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于MyBatis二级缓存深入装饰器模式

视频地址 学习文档 文章目录 一、示意代码二、装饰器三、经典案例—MyBatis二级缓存1、Cache 标准定义2、PerpetualCache 基础实现3、增强实现3-1、ScheduledCache3-2、LruCache 先来说说我对装饰器理解&#xff1a;当你有一个基础功能的代码&#xff0c;但你想在不改变原来代…

轻量封装WebGPU渲染系统示例<46>- 材质组装管线(MaterialPipeline)灯光、阴影、雾以及多Pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MaterialPipelineMultiPasses.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class MaterialPipelin…

airserver mac 7.27官方破解版2024最新安装激活图文教程

airserver mac 7.27官方破解版是一款好用的airplay投屏工具&#xff0c;可以轻松将ios荧幕镜像&#xff08;airplay&#xff09;至mac上&#xff0c;在mac平台上实现视频、音频、幻灯片等文件资源的接收及投放演示操作&#xff0c;解决iphone或ipad的屏幕录像问题&#xff0c;满…

Leetcode1466. 重新规划路线

Every day a Leetcode 题目来源&#xff1a;1466. 重新规划路线 解法1&#xff1a;深度优先搜索 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。 因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗…

实战1-python爬取安全客新闻

一般步骤&#xff1a;确定网站--搭建关系--发送请求--接受响应--筛选数据--保存本地 1.拿到网站首先要查看我们要爬取的目录是否被允许 一般网站都会议/robots.txt目录&#xff0c;告诉你哪些地址可爬&#xff0c;哪些不可爬&#xff0c;以安全客为例子 2. 首先测试在不登录的…

高项备考葵花宝典-项目进度管理核心概念加强记忆

项目进度管理的核心目标是使项目按时完成。 目录 一、待办事项列表 二、看板方法 三、在制品 四、进度计划模型 五、活动清单 六、里程碑清单 七、前导图法 八、资源日历 九、活动历时估算方法 一、待办事项列表 如上图所示&#xff0c;实际工作中需求往往不是一次性全…

【Linux】find . -perm 644 -exec ls -l {} \;

find . -perm 644 -exec ls -l {} ; find 命令使用 -perm 644 条件来查找文件权限为644的文件&#xff0c;然后通过 -exec ls -l {} \; 将这些文件传递给 ls -l 命令来显示详细的文件列表。 find . -perm 644&#xff1a;在当前目录及其子目录中查找文件权限为644的文件。 -e…

力扣每日一题day33[111. 二叉树的最小深度]

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#xff1a; 输入…

【小白专用】php执行sql脚本 更新23.12.10

可以使用 PHP 的 mysqli 扩展来执行 SQL 脚本。具体步骤如下&#xff1a; 连接到数据库&#xff1b;打开 SQL 脚本文件并读取其中的 SQL 语句&#xff1b;逐条执行 SQL 语句&#xff1b;关闭 SQL 脚本文件&#xff1b;关闭数据库连接。 以下是通过 mysqli 执行 SQL 脚本的示例…

python 画条形图(柱状图)

目录 前言 基础介绍 月度开支的条形图 前言 条形图&#xff08;bar chart&#xff09;&#xff0c;也称为柱状图&#xff0c;是一种以长方形的长度为变量的统计图表&#xff0c;长方形的长度与它所对应的变量数值呈一定比例。 当使用 Python 画条形图时&#xff0c;通常会使…

STM32 标准外设SPL库、硬件抽象层HAL库、低层LL库区别?

1、STM32 之一 HAL库、标准外设库、LL库_ZCShou的博客-CSDN博客_ll库&#xff08;仔细阅读&#xff09; 2、STM32标准外设库、 HAL库、LL库 - King先生 - 博客园 3、STM32 之 HAL库_戈 扬的博客&#xff08;仔细阅读&#xff09; 4、STM32 LL 为什么比 HAL 高效&#xff1…

通信:mqtt学习网址

看这个网址&#xff1a;讲的很详细&#xff0c;后面补实战例子 第一章 - MQTT介绍 MQTT协议中文版 (gitbooks.io)https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

【Matlab算法】多维函数求解的基本概念

多维函数求解的基本概念 多维函数最优化问题最优化算法最优化问题的类型最优化算法的分类常用的多维函数求解方法结语 多维函数 多维函数是指定义在 R n \mathbb{R}^n Rn 上的函数&#xff0c;其中 n n n 是函数的维数。例如&#xff0c; f ( x , y ) x 2 y 2 f(x, y) x^…

DL Homework 10

习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&#xff0e; 当然&#xff0c;因为我数学比较菜&#xff0c;我看了好半…

Vue3:表格单元格内容由:图标+具体内容 构成

一、背景 在Vue3项目中&#xff0c;想让单元格的内容是由 &#xff1a;图标具体内容组成的&#xff0c;类似以下效果&#xff1a; 二、图标 Element-Plus 可以在Element-Plus里面找是否有符合需求的图标iconfont 如果Element-Plus里面没有符合需求的&#xff0c;也可以在这…

掌握iText:轻松处理PDF文档-基础篇

关于iText iText是一个强大的PDF处理库&#xff0c;可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作&#xff0c;同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X&#xff0c;且iText5不是完全免费的&#xff0c;但是基础能力是免费使用的&…

MyBatis 四大核心组件之 StatementHandler 源码解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【设计模式--创建型--建造者模式】

建造者模式 建造者模式概述结构结果优缺点使用场景 将上述案例改为链式调用结果 建造者模式 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构建&#xff08;由Builder来负责&#xff09;和装配&#xff08;由Direct…

【HarmonyOS开发】拖拽动画的实现

动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#xff08;F…

[ 蓝桥杯Web真题 ]-冬奥大抽奖

目录 介绍 准备 目标 规定 思路 知识补充 解法参考 介绍 蓝桥云课庆冬奥需要举行一次抽奖活动&#xff0c;我们一起做一个页面提供给云课冬奥抽奖活动使用。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├──…