Netty3 VS Netty4 之线程模型

netty3的完整配置实例 由于netty各个版本之间差异较大,这里整理了一下各个版本的包及样例,使用了maven工程,将各个版本需要的最简jar文件已配置完全,可以在些基础上进行正式项目的开发。 立即下载

下面小节我们就详细得对Netty3和Netty4版本的I/O线程模型进行对比,以方便大家掌握两者的差异,在升级和使用中尽量少踩雷。

1 Netty 3.X 版本线程模型

Netty 3.X的I/O操作线程模型比较复杂,它的处理模型包括两部分:

  1. Inbound:主要包括链路建立事件、链路激活事件、读事件、I/O异常事件、链路关闭事件等;
  2. Outbound:主要包括写事件、连接事件、监听绑定事件、刷新事件等。

我们首先分析下Inbound操作的线程模型:

图6-1 Netty 3 Inbound操作线程模型

从上图可以看出,Inbound操作的主要处理流程如下:

  1. I/O线程(Work线程)将消息从TCP缓冲区读取到SocketChannel的接收缓冲区中;
  2. 由I/O线程负责生成相应的事件,触发事件向上执行,调度到ChannelPipeline中;
  3. I/O线程调度执行ChannelPipeline中Handler链的对应方法,直到业务实现的Last Handler;
  4. Last Handler将消息封装成Runnable,放入到业务线程池中执行,I/O线程返回,继续读/写等I/O操作;
  5. 业务线程池从任务队列中弹出消息,并发执行业务逻辑。

通过对Netty 3的Inbound操作进行分析我们可以看出,Inbound的Handler都是由Netty的I/O Work线程负责执行。

下面我们继续分析Outbound操作的线程模型:

图6-2 Netty 3 Outbound操作线程模型

从上图可以看出,Outbound操作的主要处理流程如下:

业务线程发起Channel Write操作,发送消息;

  1. Netty将写操作封装成写事件,触发事件向下传播;
  2. 写事件被调度到ChannelPipeline中,由业务线程按照Handler Chain串行调用支持Downstream事件的Channel Handler;
  3. 执行到系统最后一个ChannelHandler,将编码后的消息Push到发送队列中,业务线程返回;
  4. Netty的I/O线程从发送消息队列中取出消息,调用SocketChannel的write方法进行消息发送。

2 Netty 4.X 版本线程模型

相比于Netty 3.X系列版本,Netty 4.X的I/O操作线程模型比较简答,它的原理图如下所示:

图6-3 Netty 4 Inbound和Outbound操作线程模型

从上图可以看出,Outbound操作的主要处理流程如下:

  1. I/O线程NioEventLoop从SocketChannel中读取数据报,将ByteBuf投递到ChannelPipeline,触发ChannelRead事件;
  2. I/O线程NioEventLoop调用ChannelHandler链,直到将消息投递到业务线程,然后I/O线程返回,继续后续的读写操作;
  3. 业务线程调用ChannelHandlerContext.write(Object msg)方法进行消息发送;
  4. 如果是由业务线程发起的写操作,ChannelHandlerInvoker将发送消息封装成Task,放入到I/O线程NioEventLoop的任务队列中,由NioEventLoop在循环中统一调度和执行。放入任务队列之后,业务线程返回;
  5. I/O线程NioEventLoop调用ChannelHandler链,进行消息发送,处理Outbound事件,直到将消息放入发送队列,然后唤醒Selector,进而执行写操作。

通过流程分析,我们发现Netty 4修改了线程模型,无论是Inbound还是Outbound操作,统一由I/O线程NioEventLoop调度执行。

3. 线程模型对比

在进行新老版本线程模型PK之前,首先还是要熟悉下串行化设计的理念:

我们知道当系统在运行过程中,如果频繁的进行线程上下文切换,会带来额外的性能损耗。多线程并发执行某个业务流程,业务开发者还需要时刻对线程安全保持警惕,哪些数据可能会被并发修改,如何保护?这不仅降低了开发效率,也会带来额外的性能损耗。

为了解决上述问题,Netty 4采用了串行化设计理念,从消息的读取、编码以及后续Handler的执行,始终都由I/O线程NioEventLoop负责,这就意外着整个流程不会进行线程上下文的切换,数据也不会面临被并发修改的风险,对于用户而言,甚至不需要了解Netty的线程细节,这确实是个非常好的设计理念,它的工作原理图如下:

图6-4 Netty 4的串行化设计理念

一个NioEventLoop聚合了一个多路复用器Selector,因此可以处理成百上千的客户端连接,Netty的处理策略是每当有一个新的客户端接入,则从NioEventLoop线程组中顺序获取一个可用的NioEventLoop,当到达数组上限之后,重新返回到0,通过这种方式,可以基本保证各个NioEventLoop的负载均衡。一个客户端连接只注册到一个NioEventLoop上,这样就避免了多个I/O线程去并发操作它。

Netty通过串行化设计理念降低了用户的开发难度,提升了处理性能。利用线程组实现了多个串行化线程水平并行执行,线程之间并没有交集,这样既可以充分利用多核提升并行处理能力,同时避免了线程上下文的切换和并发保护带来的额外性能损耗。

了解完了Netty 4的串行化设计理念之后,我们继续看Netty 3线程模型存在的问题,总结起来,它的主要问题如下:

  1. Inbound和Outbound实质都是I/O相关的操作,它们的线程模型竟然不统一,这给用户带来了更多的学习和使用成本;
  2. Outbound操作由业务线程执行,通常业务会使用线程池并行处理业务消息,这就意味着在某一个时刻会有多个业务线程同时操作ChannelHandler,我们需要对ChannelHandler进行并发保护,通常需要加锁。如果同步块的范围不当,可能会导致严重的性能瓶颈,这对开发者的技能要求非常高,降低了开发效率;
  3. Outbound操作过程中,例如消息编码异常,会产生Exception,它会被转换成Inbound的Exception并通知到ChannelPipeline,这就意味着业务线程发起了Inbound操作!它打破了Inbound操作由I/O线程操作的模型,如果开发者按照Inbound操作只会由一个I/O线程执行的约束进行设计,则会发生线程并发访问安全问题。由于该场景只在特定异常时发生,因此错误非常隐蔽!一旦在生产环境中发生此类线程并发问题,定位难度和成本都非常大。

讲了这么多,似乎Netty 4 完胜 Netty 3的线程模型,其实并不尽然。在特定的场景下,Netty 3的性能可能更高,就如本文第4章节所讲,如果编码和其它Outbound操作非常耗时,由多个业务线程并发执行,性能肯定高于单个NioEventLoop线程。

LinuxMint 22.1(Ubuntu24.04)下通过Wine完美运行同花顺远航版的实战指南 本文详细介绍了在LinuxMint 22.1(Ubuntu24.04)系统下通过Wine完美运行同花顺远航版的实战指南。从基础环境准备到深度优化,包括Wine环境配置、同花顺远航版安装、字体显示调优、任务栏兼容性修复等关键步骤,帮助Linux用户高效使用同花顺远航版进行股票交易和行情分析。 阅读详情

相关推荐

思必驰离线语音芯片:智能家居控制的核心引擎

思必驰离线语音芯片TH1520通过本地化语音识别技术,为智能家居带来革命性体验。该芯片具备200-600毫秒的快速响应、75分贝抗噪能力和双核异构设计,显著提升设备交互效率。支持自定义指令和10种音色选择,开发周期缩短至3天,BOM成本降低30%,是智能家居控制的核心引擎。

redis7keeper的博客 987

Netty3和Netty 4 线程模型的区别

Netty 3 和 4 比较起来,有两点印象很深刻: 一个是 4 没有了各种event 对象的创建,GC更友好。 另一个是 4的Handler 链总是IO 线程来处理,而3 是哪种线程发起了事件,哪种线程去处理Handler 链。

纸上得来终觉浅,绝知此事要躬行 849

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1094

netty3升级到4后由于线程模型的变化引起的问题

1|Netty的特点 Netty入门比较简单,主要原因有如下几点: Netty的API封装比较简单,将复杂的网络通信通过BootStrap等工具类做了二次封装,用户使用起来比较简单;Netty源码自带的Demo比较多,通过Demo可以很快入门;Netty社区资料、相关学习书籍也比较多,学习资料比较丰富。 但是很多入门之后的Netty学习者遇到了很多困惑,例如不知道

yine的专栏 2918

AI Agent技能评测框架SkillsBench:从黑盒评估到白盒技能拆解

在人工智能领域,模型评估是衡量技术进展的核心环节。传统评测基准如GLUE、MMLU主要关注模型的通用认知能力,但实际工程应用中,AI Agent需要的是在复杂场景中协调多种能力的“职业技能”。SkillsBench创新性地将Agent能力进行原子化拆解,定义了理解规划、工具调用、推理决策、交互安全等技能维度,并通过领域专家构建的评测集确保生态效度。这一框架为Agent开发提供了精准的“度量衡”,使性能优化从经验驱动转向数据驱动,同时为不同模型和框架提供了公平比较的基础,推动了AI Agent生态从“野蛮生长

weixin_30530339的博客 389

保姆级教学:从0搭建微信小程序SpringBoot+Vue(一)

目标:实现一个微信小程序从后端数据库MySQL获取的商品展示页。 框架:后端采用SpringBoot,前端采用Vue,数据库MySQL。 部署工具:IntelliJ IDEA 2024.2专业版+HbuilderX+Node+微信开发者工具,jdk1.8已安装

weixin_44545610的博客 4925

netty3和netty4 的区别

Netty3 和 Netty4 是两个不同版本的 Netty 框架, Netty4 是在 Netty3 的基础上进行重写和改进的版本,主要有以下区别: 1. 架构设计方面 Netty3 的设计是单线程的 Reactor 模型,处理 I / O 和逻辑都在同一个线程中执行,导致 I / O 和逻辑的处理能力受限;而 Netty4 的设计采用多线程的 EventLoop 模型, I / O 和逻辑处理在不同的线程中完成,提高了并发能力。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 588

麒麟OS(Kylin OS)操作系统minikube+docker安装使用及遇到的问题

一 ,安装minikube及操作工具kubectl 1,安装kubectl 使用以下命令下载最新版本: curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 要下载指定版本(例如v1.22.0版本) ,请键入: curl -LO https://dl.k8s.io/release/v1.22.0/bin/linux/amd..

qq_23396017的博客 2643

netty实现多个handler顺序调用

在netty中,一次数据交互,可以由多个handler去处理,例如 handler1 和 handler2,那么,在前面那个handler的 messageReceived 的最后要加上 ctx.sendUpstream(e); 理论请见: http://netty.io/3.5/api/org/jboss/netty/channel/ChannelPipeline.html  A Chan...

weixin_34315189的博客 1519

3D点云修复实战:用PCN网络快速补全缺失的激光雷达数据(附代码)

本文详细介绍了PCN(Point Completion Network)网络在3D点云修复领域的实战应用。针对激光雷达数据常见的缺失问题,PCN通过端到端的深度学习架构,直接处理原始点云,实现由粗到精的快速补全。文章深入解析了其核心思想与编码器-解码器架构,并提供了完整的环境搭建、数据准备、模型实现、训练评估及在真实场景下的优化策略与代码示例,为自动驾驶、机器人等领域的开发者提供了高效的数据修复解决方案。

weixin_29041195的博客 392

华为OD机试双机位C卷-MVP争夺战 (C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【MVP争夺战】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - MVP争夺战,

qq_45776114的博客 1172

玩转Netty – 从Netty3升级到Netty4

这篇文章主要和大家分享一下,在我们基础软件升级过程中遇到的经典Netty问题。当然, 官方资料 也许是一个更好的补充。另外,大家如果对Netty及其Grizzly架构以及源码有疑问的,欢迎交流。后续会为大家奉献我们基于Grizzly和Netty构建的RPC框架的压测分析,希望大家能够喜欢! 好了,言归正传~ 依赖 Netty团队大概从3.3.0开始,将依赖坐标从 dependenc

小萍萍的博客 8582

SAP-MM-供应商对账平台(功能集合)

(1)集成OA审批,线上核销,结果写入SAP; (2)集成SRM,线上与供应商对账确认,写入SAP; (3)集成财务付款结果确认写入,OA回传结果,定时同步SRM供应商平台。 欢迎留言交流,功能完善,如需要页面设计,请订阅专栏

qq_32198063的博客 748

聊天软件开发之Netty3.x VS Netty4.x的线程模型总结

为了解决上述问题,Netty 4采用了串行化设计理念,从消息的读取、编码以及后续Handler的执行,始终都由I/O线程NioEventLoop负责,这就意外着整个流程不会进行线程上下文的切换,数据也不会面临被并发修改的风险,对于用户而言,甚至不需要了解Netty的线程细节,这确实是个非常好的设计理念。在特定的场景下,Netty 3的性能可能更高,就如本文第4章节所讲,如果编码和其它Outbound操作非常耗时,由多个业务线程并发执行,性能肯定高于单个NioEventLoop线程。

蔚可云的博客 197

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty4笔记

Netty4笔记,io模型 线程模型 reactor模型 多路复用机制 多线程 异步

Ke_dragon的博客 751

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Netty源码解读和权威指南】第05篇:Netty线程模型深度解析——Reactor三种模式你真的搞懂了吗

Netty线程模型解析:Reactor模式与最佳配置实践 Netty的高性能源于其主从Reactor线程模型的实现。本文深入解析三种Reactor模式: 单线程Reactor:简单但性能受限 多线程Reactor:引入业务线程池处理耗时任务 主从Reactor(Netty采用):Boss线程组处理新连接,Worker线程组并行处理IO 关键配置建议: BossGroup线程数通常设为1(连接处理轻量级) WorkerGroup线程数推荐CPU核数×2(充分利用多核) 避免在IO线程执行耗时操作 通过NioE

xyghehehehe的专栏 390

【Netty系列】Netty vs Java NIO

虽然 Netty 底层基于 Java NIO,但它在编程模型、线程管理、内存优化和协议支持等方面做了大量增强。内置 HTTP、WebSocket、Protobuf 等编解码器。需依赖第三方库(如 Mina、Grizzly)丰富的官方和社区插件(如日志、SSL 支持)需自行实现(如循环读取、缓冲区拼接)开发者需自行设计线程池和事件循环。需从零实现(如 HTTP 解析)无内置支持,需自行实现对象池。(读写指针分离,无需翻转)需手动分配连接给不同线程。需手动注册事件和监听。线程池,自动绑定连接。

技术改变世界 637

【Netty vs 原生NIO】为什么顶级项目都抛弃JDK选择Netty?高并发背后的抉择

fill:#333;color:#333;color:#333;fill:none;传统BIO原生NIONetty云原生时代最终抉择🚀 除非有极端定制需求,否则Netty是网络编程的不二之选!最后一句话🔥 “站在Netty的肩膀上,你只需专注业务创新,把网络难题交给专业框架!

全栈开发工程师 2066

Netty基本原理

Netty是一个高性能、异步、高可靠性,基于事件驱动的网络应用程序框架和工具,用于快速开发可维护的高性能和高可扩展性的协议服务器和客户端,换句话说,Netty是一个基于NIO客户端服务器框架,它简化Java 原生NIO开发难度,是目前最流行的NIO框架,Netty在互联网应用领域、游戏领域、大数据分布式计算领域都有广泛的应用,比如分布式服务框架Dobbo,分布式检索引擎ElasticSearch,大数据计算引擎Spark、Flink等都采用Netty作为网络通信的框架。

qq_40689430的博客 2172

在Netty使用中TLSv1.3

TLS 1.3较TLS 1.2实现了显著优化:性能方面支持0-RTT快速握手减少延迟,安全层面通过全程加密握手消息、移除不安全算法(如RC4、SHA1)和强制PSK密钥协商来提升防护。技术实现需使用Netty 4.1.54+和BoringSSL 2.0.34+,通过日志和Wireshark 3.4.2+可验证TLS_AES_128_GCM_SHA256加密套件的成功协商。Netty自4.1.52起默认支持TLS 1.3,标志着该协议已进入稳定应用阶段。

muyun2800的博客 1314

netty vs jetty

对比版本netty4.1 , jetty9.3   1.socket连接处理    jetty 使用AbstractConnector.Acceptor来处理连接, 线程数=Math.max(1, Math.min(4,cores/8)), 但是自己不new线程而是从共享的QueuedThreadPool中拿线程来执行      netty 使用一个单独的NioEventLoopGro...

原此航的博客 7350

netty+nio

netty是什么 面试官:介绍一下自己对 Netty 的认识吧!小伙子。 我:好的!那我就简单用 3 点来概括一下 Netty 吧! Netty 是一个 基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。 它极大地简化并优化了 TCP 和 UDP 套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。 支持多种协议 如 FTP,SMTP,HTTP 以及各种二进制和基于文本的传统协议。 用官方的总结就是:Netty 成功地找到了一种在不妥协

weixin_38446891的博客 1384

Netty 4 减少了GC开销

Netty是一个开源Java NIO框架,它使创建高性能协议服务器变得更加容易。Netty v3的较旧版本使用Java对象表示I / O事件。这很简单,但是会产生很多垃圾,尤其是在规模比较大的情况下。在新的Netty 4发行版中,进行了更改,以便使用寿命长的通道对象上的方法代替短暂的事件对象来处理I / O事件。还有一个使用缓冲池的专用缓冲区分配器。 我们非常重视Netty项目的性能,可用性和可持...

冯小石 486
上一篇: 理解数据库中的undo日志、redo日志、检查点
下一篇: 三种基本的存储引擎比较
kobejayandy
博客等级 码龄18年 2853粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值