news 2026/6/21 6:01:31

【Netty源码解读和权威指南】第32篇:Netty背压机制——不让发送方“撑死“接收方

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Netty源码解读和权威指南】第32篇:Netty背压机制——不让发送方“撑死“接收方

上一篇【第31篇】Netty零拷贝深度解析——性能极致的秘密武器
下一篇【第33篇】Netty连接管理与心跳检测——工业级断连处理方案


开篇故事

某支付系统,生产者TQ是消费者的10倍,结果消费者OOM了——消息发送太快,来不及处理!

背压(Back Pressure):下游处理不过来时,通知上游减速。

Netty天然支持背压:通过ChannelOutboundBuffer的水位线+TCP滑动窗口。


一、背压的TCP层基础

TCP滑动窗口: 发送方 接收方 | | |--数据1~1000------------------>| |--数据1001~2000--------------->| | 接收窗口满! |<-------ACK(win=0)------------| ← 窗口为0,暂停发送 | 处理完成 |<-------ACK(win=5000)---------| ← 窗口恢复,继续发送 |--数据2001~3000--------------->|

二、Netty应用层背压

2.1 水位线机制

// 默认配置writeBufferHighWaterMark=64KB// 高水位writeBufferLowWaterMark=32KB// 低水位// 状态转换if(pendingBytes>highWaterMark&&writable){writable=false;// 不可写fireChannelWritabilityChanged();// 触发事件}if(pendingBytes<lowWaterMark&&!writable){writable=true;// 可写fireChannelWritabilityChanged();// 触发事件}

2.2 背压处理Handler

publicclassBackPressureHandlerextendsChannelInboundHandlerAdapter{privatevolatilebooleanpaused;privateQueue<Object>buffer=newConcurrentLinkedQueue<>();@OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){if(paused){buffer.offer(msg);// 暂存}else{ctx.fireChannelRead(msg);// 正常传播}// 发送响应并检查水位线ChannelFuturef=ctx.writeAndFlush(process(msg));if(!ctx.channel().isWritable()){f.addListener(future->{paused=true;// 暂停从上游拉取数据upstreamSource.pause();});}}@OverridepublicvoidchannelWritabilityChanged(ChannelHandlerContextctx){if(ctx.channel().isWritable()){paused=false;upstreamSource.resume();// 处理积压消息Objectmsg;while((msg=buffer.poll())!=null){ctx.fireChannelRead(msg);}}ctx.fireChannelWritabilityChanged();}}

三、实战:带背压的代理服务器

publicclassBackPressureProxyextendsChannelInboundHandlerAdapter{privateChannelbackendChannel;privatebooleanfrontendPaused;@OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){if(backendChannel!=null&&backendChannel.isActive()){backendChannel.writeAndFlush(msg).addListener(f->{// 检查后端是否满if(!backendChannel.isWritable()&&!frontendPaused){frontendPaused=true;ctx.channel().config().setAutoRead(false);// 暂停读前端}});}}@OverridepublicvoidchannelWritabilityChanged(ChannelHandlerContextctx){if(ctx.channel().isWritable()&&frontendPaused){frontendPaused=false;ctx.channel().config().setAutoRead(true);// 恢复读前端}ctx.fireChannelWritabilityChanged();}}

四、背压链路图

客户端→Netty前端Handler→Netty后端Handler→下游服务 ↑ ↑ autoRead=false channelWritabilityChanged (暂停读取) (恢复读取) | | +--------→ 水位线触发 ←-------------+

五、总结

层级机制
TCP层滑动窗口,窗口=0时自动暂停发送
Netty应用层writeBufferWaterMark + channelWritabilityChanged
业务层autoRead(false)暂停读,业务处理完后恢复

上一篇【第31篇】Netty零拷贝深度解析——性能极致的秘密武器
下一篇【第33篇】Netty连接管理与心跳检测——工业级断连处理方案


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

华为光猫配置解密终极指南:5分钟学会查看加密配置文件

华为光猫配置解密终极指南&#xff1a;5分钟学会查看加密配置文件 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 华为光猫配置解密工具是一款专为网络工程师和技术…

作者头像 李华
网站建设 2026/6/21 5:39:20

从零打造卡通心跳:Arduino舵机控制与3D打印创意项目实践

1. 项目缘起&#xff1a;一个“跳动”的卡通心脏最近在逛一些创意编程社区和电子爱好者论坛时&#xff0c;经常看到“跳动的心脏”这个主题项目。从简单的LED闪烁&#xff0c;到复杂的3D打印机械结构&#xff0c;大家似乎都对这个象征着生命与情感的符号情有独钟。作为一个喜欢…

作者头像 李华
网站建设 2026/6/21 5:37:10

嵌入式GUI动画与视频播放:emWin的GUI_ANIM与GUI_MOVIE实战指南

1. 项目概述在嵌入式图形界面开发领域&#xff0c;让静态的界面“动起来”是提升产品交互体验和视觉吸引力的关键一步。无论是仪表盘上平滑移动的指针、菜单栏优雅的展开动画&#xff0c;还是设备状态指示的闪烁效果&#xff0c;甚至是播放一段产品演示视频&#xff0c;这些动态…

作者头像 李华
网站建设 2026/6/21 5:36:26

Ubuntu+Gradio快速部署机器学习Web应用实战

1. 为什么用 Gradio 在 Ubuntu 上搭机器学习 Web 应用&#xff0c;而不是 Flask 或 Streamlit&#xff1f;我第一次在客户现场部署一个图像分类模型时&#xff0c;用的是 Flask。前后花了三天&#xff1a;写路由、设计 HTML 表单、处理文件上传、加 CSRF 防护、配 Nginx 反向代…

作者头像 李华
网站建设 2026/6/21 5:35:32

Web安全入门:从站库分离与MVC架构理解应用安全基础

1. 项目概述&#xff1a;从零开始的网络安全学习之旅今天开始&#xff0c;我们正式踏入网络安全学习的实战领域。很多朋友一提到安全&#xff0c;脑子里可能立刻蹦出各种炫酷的漏洞利用和渗透测试场景&#xff0c;但我的经验告诉我&#xff0c;万丈高楼平地起&#xff0c;如果不…

作者头像 李华
网站建设 2026/6/21 5:34:51

嵌入式GUI图像处理实战:BMP/JPEG/GIF格式选择与emWin API优化

1. 嵌入式GUI中的图像处理&#xff1a;从格式选择到API实战在嵌入式系统里做图形界面开发&#xff0c;图像显示是个绕不开的坎。你手头的MCU可能只有几十KB的RAM&#xff0c;Flash空间也紧巴巴的&#xff0c;但产品经理却希望界面能媲美手机App——图标要清晰&#xff0c;照片要…

作者头像 李华