【Netty的线程模型】

Netty

Netty是一个网络应用程序框架,快速开发高性能、高可靠性的网络服务器和客户端程序。也就是用于网络编程的一个框架

Netty核心模块

image

  • 内存管理
    主要提高高效的内存管理,包含内存分配,内存回收。

  • 网通通道
    复制网络通信,例如实现对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)

一个网络交互的常见步骤

image

  • 服务端启动,并在特定端口上监听,例如 web 应用的 80端口。
  • 客户端发起TCP的三次握手,与服务端建立连接,这里以 NIO 为例,连接成功建立后会创建NioSocketChannel对象。
  • 服务端通过 NioSocketChannel 从网卡中读取数据
  • 服务端根据通信协议从二进制流中解码出一个个请求。
  • 根据请求,执行对应的业务操作,例如 Dubbo 服务端接受一个查询用户ID为1的用户信息。
  • 将业务执行结果返回到客户端,通常涉及到协议编码、压缩等。

线程模型需要解决的问题

包括连接监听、网络读写、编码、解码、业务执行等操作步骤如何运用多线程编程,提升性能

主从多Reactor模型如何解决上述问题?

  1. 连接的建立:Main Reactor线程池负责,创建NioSocketChannel后,将其转发给SubReactor
  2. SubReator线程池主要负责网络的读写(从网络中读字节流、将字节流发送到网络中)
  3. 编码、解码、业务执行,则具体情况具体分析;通常编码、解码会放在IO线程中执行,而业务逻辑的执行通常会采用额外的线程池

Netty的线程模型

基于主从多reactor模型
image

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线程中所有通道的事件是串行处理的
posted @   tootooquan  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示