每日面试题10:令牌桶

令牌桶算法:优雅的流量控制艺术

在现代分布式系统中,流量控制如同交通信号灯般重要——它既不能让请求"堵死"系统,也不能放任流量"横冲直撞"。令牌桶算法(Token Bucket Algorithm)正是这样一种精妙的流量控制机制,它像一个智能的"漏斗",既能平稳疏导请求洪流,又能灵活应对突发流量。下面让我们深入解析这个经典算法。


一、令牌桶算法:基本原理

令牌桶算法的核心思想可以概括为:

​"以固定速率向桶中添加令牌,请求需获取令牌才能执行,桶满则令牌暂存,桶空则请求等待"​

具体运作机制如下:

  1. ​桶的容量(Capacity)​

    • 桶的最大容量决定了系统允许的​​最大突发流量​
    • 例如:容量=10表示系统最多可一次性处理10个请求
  2. ​令牌生成速率(Refill Rate)​

    • 系统以恒定速率向桶中添加令牌(如每秒1个令牌)
    • 这决定了系统的​​长期平均处理速率​
  3. ​令牌获取规则​

    • 当请求到达时:
      • 若桶中有令牌 → 取走令牌,请求立即执行
      • 若桶为空 → 请求必须等待直到有足够令牌(或直接拒绝)
  4. ​动态平衡特性​

    • 桶未满时:新令牌持续填充(速率=生成速率)
    • 桶已满时:新令牌被丢弃(不会导致桶溢出)

https://example.com/token-bucket-diagram.png
(示意图:令牌以固定速率添加,请求按需消耗令牌)


二、令牌桶 vs 漏桶:两种流量控制策略对比
特性令牌桶算法漏桶算法
​流量整形方向​控制请求进入速率控制请求离开速率
​突发流量处理​允许一定突发(消耗积累令牌)严格平滑输出(固定速率)
​实现复杂度​较简单相对复杂
​典型应用场景​API限流、网络拥塞控制流量整形、平滑输出

​关键区别​​:令牌桶是"请求驱动"(请求消耗令牌),漏桶是"系统驱动"(系统固定速率处理)


三、令牌桶的核心作用
  1. ​防止系统过载​

    • 通过限制单位时间内的请求处理量,避免资源耗尽(如数据库连接池打满)
  2. ​保障服务质量(QoS)​

    • 确保高优先级请求在流量高峰时仍能获得资源
  3. ​灵活应对突发流量​

    • 允许短时间内的请求峰值(如秒杀活动开始时的瞬时流量)
  4. ​分布式系统协调​

    • 在微服务架构中实现跨服务的统一限流策略

四、令牌桶的典型应用场景
  1. ​API网关限流​

    • 例如:Spring Cloud Gateway集成Redis实现的分布式令牌桶
  2. ​网络安全防护​

    • 防御DDoS攻击:限制单个IP的请求速率
  3. ​消息队列消费控制​

    • Kafka消费者以固定速率拉取消息,避免下游系统过载
  4. ​云计算资源调度​

    • 云服务商对用户API调用进行配额管理

五、令牌桶的实现要点(伪代码示例)
class TokenBucket:def __init__(self, capacity, refill_rate):self.capacity = capacity      # 桶容量self.tokens = capacity        # 当前令牌数self.refill_rate = refill_rate # 令牌生成速率(令牌/秒)self.last_refill_time = time.time()  # 上次填充时间def allow_request(self, tokens_needed=1):# 计算自上次填充以来新增的令牌now = time.time()elapsed = now - self.last_refill_timenew_tokens = elapsed * self.refill_rate# 填充令牌(不超过容量)self.tokens = min(self.capacity, self.tokens + new_tokens)self.last_refill_time = now# 检查是否有足够令牌if self.tokens >= tokens_needed:self.tokens -= tokens_neededreturn Truereturn False

​关键参数调优建议​​:

  • 容量设置:建议为平均流量的2-3倍以容纳突发
  • 生成速率:根据系统处理能力设定(如QPS上限)

六、进阶思考:分布式令牌桶

在微服务架构中,单机令牌桶存在局限性。解决方案包括:

  1. ​Redis + Lua脚本​

    • 利用Redis的原子操作实现分布式计数器
    • 通过Lua脚本保证"检查令牌+消耗令牌"的原子性
  2. ​中间件方案​

    • 使用Sentinel、Resilience4j等成熟组件
    • 支持动态配置限流规则
  3. ​自适应令牌桶​

    • 根据系统负载动态调整生成速率
    • 实现更智能的流量控制

总结

令牌桶算法以其优雅的设计,在"严格限制"与"灵活应对"之间找到了完美平衡。它既像一位严谨的交通警察,确保请求有序通过;又像一位贴心的服务生,在高峰期能灵活调配资源。理解并合理应用令牌桶算法,将为你的系统构筑起一道可靠的流量防线。

​实践建议​​:

  1. 在API网关层实施全局限流
  2. 关键业务接口设置独立令牌桶
  3. 结合熔断降级机制形成完整防护链

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915418.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915418.shtml

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

相关文章

【java】消息推送

文章目录Java网页消息推送解决方案 短轮询、长轮询、SSE、Websocket

STM32 | 有源蜂鸣器响,无源蜂鸣器播音乐

目录 Overview 有源蜂鸣器 无源蜂鸣器 有源蜂鸣器控制 GPIO配置 控制程序 无源蜂鸣器控制 反转GPIO控制 GPIO配置 控制接口 PWM控制 GPIO配置 控制函数 改变频率播音乐 原理 1. 频率决定音调 2. 占空比决定音量 GPIO初始化 结构体定义和音符频率表 播放接口 …

第十四章 gin基础

文章目录Gin快速搭建一个web服务Gin数据交互JSON串内容规范Gin使用结构体返回数据给前端Gin配置POST类型的路由Gin获取GET请求参数Gin获取POST请求参数-form-data类型Gin获取POST请求参数-JSON类型Gin获取参数绑定至结构体Gin快速搭建一个web服务 下载包 \\新建一个文件&…

Baumer工业相机堡盟工业相机如何通过YoloV8的深度学习模型实现PCB的缺陷检测(C#代码,UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8的深度学习模型实现PCB的缺陷检测(C#代码,UI界面版)工业相机使用YoloV8模型实现PCB的缺陷检测工业相机实现YoloV8模型实现PCB的缺陷检测的技术背景在相机SDK中获取图像转换图像的代码分析工业相机图…

【Vivado那些事儿】AMD-XILINX 7系列比特流加密

前提:加密有风险,操作需谨慎前言在许多项目中,经过漫长的等待,我们的 FPGA 设计终于可以投入现场部署了。前期的资金的投入及知识产权的保护,我们需要对现场部署的 FPGA 进行比特流保护以防止逆向工程和未经授权的重复…

RK3588 安卓adb操作

adb(Android Debug Bridge)是一个用于与安卓设备进行通信和控制的工具。adb可以通过USB或无线网络连接安卓设备,执行各种命令,如安装和卸载应用,传输文件,查看日志,运行shell命令等。adb是安卓开…

【华为机试】70. 爬楼梯

文章目录70. 爬楼梯描述示例 1示例 2提示解题思路核心分析问题建模算法实现方法1:动态规划(标准解法)方法2:空间优化动态规划(最优解)方法3:递归 记忆化方法4:数学公式(…

山东大学软件学院面向对象期末复习

面向对象 文章目录面向对象04 类封装接口 抽象类05 消息,实例化,静态变量方法消息动/静态类型语言对象创建类及实例具有下面特征对象数组的创建静态数据成员构造函数06_0 继承继承是向下传递的JAVA为什么不支持多重继承继承的形式特殊化继承替换原则规范…

让 Windows 用上 macOS 的系统下载与保姆级使用教程

模拟苹果桌面软件下载:https://xpan.com.cn/s/8NFAGT 还记得 Windows 11刚发布时,很多人就说“果里果气"的,但界面确实做的漂亮。 不知道现在有多少小伙伴正用着macOS,不过我敢确定,喜欢macOS的人绝对不少&#…

嵌入式硬件篇---继电器

继电器是一种通过小电流控制大电流的电磁开关,广泛应用于自动化控制、电力系统和电子设备中。以下从工作原理、应用场景和电路特点三个方面详细介绍:一、工作原理继电器本质是电磁控制的机械式开关,核心部件包括:线圈(…

鸿蒙网络编程系列58-仓颉版TLS数字证书查看及验签示例

1. TLS数字证书验签简介 数字证书的签名验证是网络编程中一个重要的功能,它保证了数字证书是由可信任的签发方签署的,在此基础上,我们才可以信任该证书,进而信任基于该证书建立的安全通道,所以说,数字证书…

【React Native】安装配置 Expo Router

过去开发React Native,所使用的路由都是React Navigation。但是这个东西使用起来非常困难,配置无比繁琐。Expo,为了简化操作,就基于React Navigation开发了Expo Router。 Expo Router用起来就要简单的多了,配置也相对…

美国VPS服务器Linux内核参数调优的实践与验证

美国vps服务器Linux内核参数调优的实践与验证在云计算和虚拟化技术日益普及的今天,美国VPS服务器因其稳定的网络环境和优越的性价比,成为众多企业和开发者的首选。Linux内核参数的默认配置往往无法充分发挥VPS的性能潜力。本文将深入探讨美国VPS服务器上…

在Vscode中使用Kimi K2模型:实践指南,三分钟生成个小游戏

Kimi K2是一款基于多专家(MoE)架构的强大代码与代理能力基础模型。本文将通过在VS Code及其扩展Cline和RooCode中的实际应用,详细说明如何使用Kimi K2-0711-preview模型。不得不说kimi这次的K2模型就是强大,在vscode中配置使用体验…

基于SpringBoot+Uniapp球场预约小程序(腾讯地图API、Echarts图形化分析、二维码识别)

“ 🎈系统亮点:腾讯地图API、Echarts图形化分析、二维码识别”01系统开发工具与环境搭建前后端分离架构 项目架构:B/S架构 运行环境:win10/win11、jdk17前端: 技术:框架Vue.js;UI库:…

windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试

windows phpstorm 2024 phpstudy 8 php7.3 thinkphp6 配置xdebug调试 下载配置phpstudyPhp.ini配置phpstorm配置xdebug运行一会就停了配置虚拟机 0localhost_90.conf 配置php.ini配置下载 在下面地址下载合适的xdebug 放到对应的php https://xdebug.org/wizard 配置phpst…

python的pywebview库结合Flask和waitress开发桌面应用程序简介

pywebview的用途与特点 用途 pywebview是一个轻量级Python库,用于创建桌面应用程序(GUI)。它通过嵌入Web浏览器组件(如Windows的Edge/IE、macOS的WebKit、Linux的GTK WebKit),允许开发者使用HTML/CSS/Java…

C#通过HslCommunication连接西门子PLC1200,并防止数据跳动的通用方法

textEdit30.Text ReadValue<int>(() > plc.ReadInt32("DB57.DBD16"), ref _last_num).ToString();// 通用读取方法&#xff08;支持所有值类型&#xff09;private T ReadValue<T>(Func<OperateResult<T>> readFunc, ref T lastValue) w…

Linux切换到Jenkins用户解决Jenkins Host key verification failed

以root或sudo user身份, 切换到jenkins用户 su -s /bin/bash jenkins前往jenkins的home目录 cd /var/lib/jenkins/查看.ssh下是否已经有known_hosts, 有的话, 是什么内容, 正常情况下, 这时候是没有对应IP记录的 cd .ssh/ more known_hosts访问一下对应IP, 记录公钥 ssh 192.16…

7.17 Java基础 | 集合框架(下)

接上文&#xff1a; 7.16 Java基础 | 集合框架&#xff08;上&#xff09;-CSDN博客 【1】Map集合 Map 集合是一种能存储键值对的数据结构。它的主要功能是依据键&#xff08;Key&#xff09;来快速查找对应的值&#xff08;Value&#xff09; 1、声明 Map<Integer,Integer…