【Netty的线程模型】
Netty
Netty是一个网络应用程序框架,快速开发高性能、高可靠性的网络服务器和客户端程序。也就是用于网络编程的一个框架
Netty核心模块
-
内存管理
主要提高高效的内存管理,包含内存分配,内存回收。 -
网通通道
复制网络通信,例如实现对NIO、OIO等底层JAVA API 的封装,简化网络编程模型。 -
线程模型
提供高效的线程协作模型。
Netty的线程模型涉及那些重要角色?
主从多Reactor模型
主要涉及的几个角色:
-
Acceptor
作为请求的接收者,但并不真正负责连接请求的建立,而是起到转发的作用,将其请求委托Main Reactor线程池来实现。 -
Main Reactor
主Reactor线程组,主要负责连接事件,并将IO读写请求转发到SubReactor线程池。当然在一些需要对客户端进行权限控制等场景下,权限校验的职责可以放到 Main Reactor 线程池,即 Main Reactor 也可以注册通道的读写事件,读取客户端权限校验相关的数据包,执行权限验证,权限验证通过后再将通道注册到IO线程。
-
Sub Reactor
Main Reactor 通常监听客户端连接后会将通道的读写转发到 Sub Reactor 线程池中一个线程(负载均衡),负责数据的读写。在 NIO 中 通常注册通道的读(OP_READ)、写事件(OP_WRITE)
一个网络交互的常见步骤
- 服务端启动,并在特定端口上监听,例如 web 应用的 80端口。
- 客户端发起TCP的三次握手,与服务端建立连接,这里以 NIO 为例,连接成功建立后会创建NioSocketChannel对象。
- 服务端通过 NioSocketChannel 从网卡中读取数据。
- 服务端根据通信协议从二进制流中解码出一个个请求。
- 根据请求,执行对应的业务操作,例如 Dubbo 服务端接受一个查询用户ID为1的用户信息。
- 将业务执行结果返回到客户端,通常涉及到协议编码、压缩等。
线程模型需要解决的问题
包括连接监听、网络读写、编码、解码、业务执行等操作步骤如何运用多线程编程,提升性能
主从多Reactor模型如何解决上述问题?
- 连接的建立:Main Reactor线程池负责,创建NioSocketChannel后,将其转发给SubReactor
- SubReator线程池主要负责网络的读写(从网络中读字节流、将字节流发送到网络中)
- 编码、解码、业务执行,则具体情况具体分析;通常编码、解码会放在IO线程中执行,而业务逻辑的执行通常会采用额外的线程池
Netty的线程模型
基于主从多reactor模型
Netty中网络的连接事件(OP_ACCEPT)由Main Reactor线程组实现,即Boss Group,通常只需设置一个线程。
网络的读写操作由 Work Group ( Sub Reactor) 线程组来实现,线程的个数默认为 2 * CPU Core(IO线程),一个 Channel 绑定到其中一个 Work 线程,一个 Work 线程中可以绑定多个 Channel。
在 Netty 中编码、解码等操作会被封装成一个一个事件处理器(ChannelHandler),默认情况下ChannelHandler 是在 IO 线程中执行
总结
- Netty 的线程模型基于主从多Reactor模型。通常由一个线程负责处理OP_ACCEPT事件,拥有 CPU 核数的两倍的IO线程处理读写事件。
- 一个通道的IO操作会绑定在一个IO线程中,而一个IO线程可以注册多个通道。
- 在一个网络通信中通常会包含网络数据读写,编码、解码、业务处理。默认情况下编码、解码等操作会在IO线程中运行,但也可以指定其他线程池。
- 通常业务处理会单独开启业务线程池,但也可以进一步细化,例如心跳包可以直接在IO线程中处理,而需要再转发给业务线程池,避免线程切换。
- 在一个IO线程中所有通道的事件是串行处理的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)