尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
一桶令牌的时间账本:四类限流算法的边界推演与Guava RateLimiter源码精读
目录一、限流到底在管什么(一)整点那一秒发生了什么(二)速率、并发与排队:三种约束各管一段1、速率限制:单位时间放进来多少2、并发限制:此刻同时在办多少3、排队限制:最多允许等多少(三)否决式与整形式:被限住的请求去哪儿(四)读懂限流参数的三把尺子(五)实验环境与运行方式二、固定窗口:最便宜的计数器与它的边界漏洞(一)算法与实现(二)边界双倍突发的推演(三)它仍然值得用的场合三、滑动窗口:把格子切细,还是把账记全(一)滑动日志:精确但状态随流量增长(二)分桶滑动计数:用子窗口换内存(三)两桶加权近似:只存两个数(四)实测:子桶越多,双倍突发并没有消失(五)旁支:TCP 的滑动窗口管的是另一件事四、漏桶:把不规则的进水整成匀速出水(一)漏桶的两种形态1、队列式漏桶2、计量式漏桶(二)队列式漏桶的代价:排队不是免费的(三)Nginx limit_req:一只用 excess 记账的漏桶1、配置语义2、千分位记账的 excess3、延迟交给定时器,而不是让 worker 睡觉4、burst 是排队容量,不是免费额度五、令牌桶:允许攒令牌的限流(一)定义与两个参数(二)懒惰补充:不需要后台线程(三)令牌桶与漏桶:一体两面(四)四类算法横向对照六、主流限流组件的取舍(一)Guava RateLimiter:单机平滑令牌桶(二)Resilience4j RateLimiter:按周期发放的许可(三)Sentinel:滑动窗口统计与三种流控效果(四)集群配额:把令牌发放收归一处(五)其他常见选择(六)选型对照七、Guava RateLimiter 的用法与语义(一)两种构造与四个入口(二)预消费:这一笔的账,记在下一位头上(三)tryAcquire 的判定口径(四)setRate:存量按比例换算八、源码精读:SmoothRateLimiter 的时间账本(一)类结构与四个字段(二)resync:有人来,才补账(三)reserveEarliestAvailable:先放行,后结算(四)SmoothBursty:存量零成本(五)SmoothWarmingUp:把存量翻译成等待时间1、预热函数与三个关键量2、积分的计算3、冷却速度4、实测爬坡曲线(六)锁与睡眠:为什么 sleep 在锁外九、复刻与对账:一只迷你平滑限流器(一)为什么要自己复刻(二)逐笔对账的方法十、生产落地:从单机限速到分层防护(一)六个常见误用1、每次请求 new 一个 RateLimiter2、在 IO 线程或入口线程里 acquire3、acquire 一个很大的数4、单机阈值乘以实例数5、只限次数,不看成本6、不监控等待与拒绝(二)集群里的误杀与放大(三)分层防护:四道关各守一段(四)被限住之后:响应契约与客户端行为(五)参数从哪里来十一、总结(一)四个追问的答案(二)适用范围与不适用场景参考文章干货分享,感谢您的阅读!“每秒最多 100 次”真正落到系统里至少牵出四个追问:这 100 次按哪一秒算?第 101 次是立刻拒绝还是排队等?空闲了一会儿之后能不能一口气多放几个?部署了 8 个实例之后,“100”说的是每台还是总共?很多线上事故并不是因为没有限流,而是因为限流器在这几个问题上的回答,和写配置的人心里想的不一样。这次我们要解决的问题是:把限流这件事从“背四个算法名字”推进到“能算清每一笔账”——给定一个限流配置,能准确说出它在边界、突发、空闲和多实例下到底会放行多少、拒绝多少、让谁等多久。我们先厘清限流到底在约束什么,再把固定窗口、滑动窗口、漏桶、令牌桶四类算法放进同一个可复现的虚拟时间实验台,用实测数字去看它们在窗口边界、突发流量、对抗流量下的真实表现;顺路拆开 Nginxlimit_req的千分位记账和 TCP 滑动窗口这两个常被混为一谈的“近亲”。随后横向对照 Guava、Resilience4j、Sentinel、集群配额等主流组件;最后把重心放在 GuavaRateLimiter上——它的预消费语义、懒惰补账、预热积分都藏在不到四百行的SmoothRateLimiter里,我们会逐行读懂,再自己复刻一只迷你版本,与 Guava 在同一条虚拟时间线上做七万次逐笔对账。本文适合在 Java 服务里配置或自研限流的后端工程师,以及需要为网关、Nginx 定阈值的同学。读完希望你应当能够:判断某个场景该用否决式还是整形式、该选哪类算法;看懂burst、nodelay
RELATED

相关推荐

Skywalking 9.4分布式链路追踪与性能监控实战指南

Skywalking 9.4分布式链路追踪与性能监控实战指南

1. Skywalking概述与应用场景Skywalking是一款开源的APM(应用性能监控)系统,专为分布式系统设计,能够对微服务架构中的服务调用链路进行全链路追踪和性能分析。它通过探针无侵入式地采集数据,支持Java、.NET Core、Nod…

📅 2026/11/6 4:38:27
工业自动化分拣系统:PLC与WinCC实现智能控制

工业自动化分拣系统:PLC与WinCC实现智能控制

1. 项目概述:工业自动化分拣系统的核心实现在工业自动化产线上,机械手分拣系统是典型的机电一体化应用。这个基于西门子S7-300 PLC和WinCC组态的控制系统,实现了物料智能分拣的全流程自动化控制。作为工业现场最常见的控制方案组合&#xff0…

📅 2026/11/6 4:38:27
MyObj 1.1版本解析:S3协议支持与轻量级对象存储实践

MyObj 1.1版本解析:S3协议支持与轻量级对象存储实践

1. MyObj 1.1版本深度解析:从S3协议支持到企业级文件管理实践作为一名长期关注开源存储解决方案的技术从业者,我最近详细测试了MyObj 1.1版本。这个用Golang编写的轻量级对象存储系统在最新版本中实现了多项关键改进,特别是对S3协议的全面支持…

📅 2026/11/6 4:38:27
MORE NEWS

更多资讯

📰

半正定矩阵:概念、判定与应用全解析

1. 半正定矩阵的基本概念半正定矩阵(Positive Semi-Definite Matrix,简称PSD矩阵)是线性代数中一类特殊的对称矩阵。这类矩阵在优化问题、机器学习、信号处理等领域有着广泛的应用。简单来说,一个实对称矩阵A如果满足对于所有非零…

📰

C++将二叉树转为双向链表及判断两个链表是否相交

前言 这篇把两个常被放在一起问的指针操作题放在一篇里讲。第一题是把一棵二叉搜索树(binary search tree, BST)原地转换成一个有序的双向链表,不新建结点,只改写指针;第二题是判断两个单链表是否相交,如果…

📰

SSD硬盘测速工具AS SSD Benchmark:四项指标解读与跑分避坑

简介:AS SSD Benchmark 是一款面向 SSD 用户的轻量级硬盘性能测试工具,版本 v1.8.5611.39791,适合希望了解固态硬盘真实读写表现、排查性能瓶颈或进行硬件选型对比的普通用户与装机爱好者。压缩包共 4 个文件,约 285KB&#xff0c…

📰

C#高性能Socket通信库设计与高并发优化实践

1. 项目概述:高并发Socket通信的核心价值在网络通信领域,Socket编程一直是构建分布式系统的基石。这个C#实现的高性能Socket通信库,完整覆盖了TCP/UDP的客户端与服务端实现,特别针对高并发场景进行了深度优化。我曾在一个物联网平…

📰

010 Editor二进制解析:模板与脚本定位配置块

简介:这是一套面向开发人员、系统管理员及逆向与数据分析学习者的010 Editor十六进制编辑工具包,重点解决二进制文件查看修改、大文本检索替换和复杂文件结构解析等需求。压缩包共35个文件,约19.64MB,以dll运行库、exe主程序、qhc…

📰

KITTI点云可视化工具:纯Python轻量级交互式驾驶场景探查器

简介:本资源是一个面向自动驾驶感知算法学习者的KITTI数据集可视化工具集,专为点云处理与BEV(鸟瞰图)分析初学者及研究人员设计,解决原始.bin点云数据难以直观理解、多视角对比困难等实际问题。压缩包共42个文件&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬