news 2026/6/20 22:46:33

【Netty源码解读和权威指南】第37篇:Netty流量整形——优雅控制客户端发送速率

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Netty源码解读和权威指南】第37篇:Netty流量整形——优雅控制客户端发送速率

上一篇【第36篇】Netty时间轮高级应用——10亿级定时任务的工程实践
下一篇【第38篇】Netty SSL TLS安全传输——HTTPS背后的Netty实现


一、为什么需要流量整形?

某支付系统,上游每天凌晨批量同步数据,带宽被占满,影响正常交易。

流量整形:平滑流量,避免突发压垮下游。


二、原理:令牌桶算法

令牌桶:容量10 每秒产生5个令牌 时刻0: [T][T][T][T][T][_][_][_][_][_] (5个令牌) 发送3个包 → [T][T][_][_][_][_][_][_][_][_] (剩2个令牌) 时刻1: [T][T][T][T][T][T][T][_][_][_] (补充5个,共7个) 发送6个包 → [T][_][_][_][_][_][_][_][_][_] (剩1个令牌) 发送4个包 → [T][_][_][_][_][_][_][_][_][_] ↑ 只有1个令牌,只发送1个,3个等待!

三、GlobalTrafficShapingHandler

// 全局流量整形:所有Channel共享带宽pipeline.addLast(newGlobalTrafficShapingHandler(eventExecutor,1024*1024,// writeLimit: 1MB/s 写速率1024*1024,// readLimit: 1MB/s 读速率1000// checkInterval: 1秒检查一次));// 源码核心:AbstractTrafficShapingHandler// 计算等待时间,延迟发送longwait=trafficCounter.readTimeToWait(size,limit,interval);if(wait>0){ctx.executor().schedule(()->{ctx.write(msg,promise);},wait,TimeUnit.MILLISECONDS);}

四、ChannelTrafficShapingHandler

// 每个Channel独立限速pipeline.addLast(newChannelTrafficShapingHandler(512*1024,// 每个连接512KB/s0// 不限读));

五、实战:防DDoS连接限流

publicclassAntiDdosHandlerextendsChannelInboundHandlerAdapter{privatefinalGlobalTrafficShapingHandlertrafficHandler;privatefinalAtomicIntegerconnections=newAtomicInteger();privatestaticfinalintMAX_CONNECTIONS=10000;publicAntiDdosHandler(EventExecutorexecutor){trafficHandler=newGlobalTrafficShapingHandler(executor,1024*1024,0);}@OverridepublicvoidchannelActive(ChannelHandlerContextctx){if(connections.incrementAndGet()>MAX_CONNECTIONS){System.out.println("连接数超限,拒绝新连接");ctx.close();}else{ctx.pipeline().addFirst(trafficHandler);ctx.fireChannelActive();}}@OverridepublicvoidchannelInactive(ChannelHandlerContextctx){connections.decrementAndGet();ctx.fireChannelInactive();}}

六、对比总结

Handler范围配置
GlobalTrafficShapingHandler所有Channel共享writeLimit=1MB/s
ChannelTrafficShapingHandler单个Channel独立writeLimit=512KB/s
GlobalChannelTrafficShapingHandler全局+单Channel双重控制灵活组合

上一篇【第36篇】Netty时间轮高级应用——10亿级定时任务的工程实践
下一篇【第38篇】Netty SSL TLS安全传输——HTTPS背后的Netty实现


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 22:46:11

如何集成Sidekiq-Statistic到Rails应用:从入门到精通

如何集成Sidekiq-Statistic到Rails应用:从入门到精通 【免费下载链接】sidekiq-statistic See statistic about your workers 项目地址: https://gitcode.com/gh_mirrors/si/sidekiq-statistic 在Ruby on Rails应用开发中,后台任务处理是提升应用…

作者头像 李华
网站建设 2026/6/20 22:33:12

嵌入式GUI开发实战:emWin多语言支持与显示驱动配置详解

1. 项目概述:嵌入式GUI开发中的多语言与显示驱动在嵌入式系统开发中,图形用户界面(GUI)是连接用户与设备的核心桥梁。无论是工业控制面板、医疗设备显示屏,还是智能家居终端,一个直观、流畅且能适应全球不同…

作者头像 李华
网站建设 2026/6/20 22:08:11

Python+Selenium实战:构建端到端业务压力测试框架

1. 项目概述:当UI自动化遇上压力测试在软件测试的日常工作中,我们常常面临两个看似独立的战场:一个是前端交互的战场,需要验证用户点击、输入、跳转等流程是否丝滑顺畅,这通常由Web UI自动化测试(比如用Sel…

作者头像 李华
网站建设 2026/6/20 22:00:41

如何高效使用开源网盘直链下载助手:专业用户的实战指南

如何高效使用开源网盘直链下载助手:专业用户的实战指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

作者头像 李华