Netty系列三:netty线程模型

netty使用reactor反应堆线程模型。

一、Reactor模型单线程模型如下:
Netty系列三:netty线程模型_第1张图片

  • 用户发起IO操作到事件分离器
  • 事件分离器调用相应的处理器处理事件
  • 事件处理完成,事件分离器获得控制权,继续相应处理

二、Reactor模型多线程模型如下:
但单线程的Reactor模型每一个用户事件都在一个线程中执行:
- 性能有极限,不能处理成百上千的事件
- 当负荷达到一定程度时,性能将会下降
- 某一个事件处理器发送故障,不能继续处理其他事件

Netty系列三:netty线程模型_第2张图片

三、Reactor主从多现成模型

  • Acceptor(boss线程池)不再是一个单独的NIO线程,而是一个独立的NIO线程池
  • Acceptor(boss线程池)处理完后,将事件注册到IO线程池(work线程池)的某个线程上
  • IO线程继续完成后续的IO操作
  • Acceptor(boss线程池)仅仅完成登录、握手和安全认证等操作,IO(work线程池)操作和业务处理依然在后面的从线程中完成

Netty系列三:netty线程模型_第3张图片

NioEventLoop

NioEventLoop是Netty的Reactor线程,它在Netty Reactor线程模型中的职责如下:

  1. 作为服务端Acceptor线程,负责处理客户端的请求接入
  2. 作为客户端Connecor线程,负责注册监听连接操作位,用于判断异步连接结果
  3. 作为IO线程,监听网络读操作位,负责从SocketChannel中读取报文
  4. 作为IO线程,负责向SocketChannel写入报文发送给对方,如果发生写半包,会自动注册监听写事件,用于后续继续发送半包数据,直到数据全部发送完成
    如下图,是一个NioEventLoop的处理链:

Netty系列三:netty线程模型_第4张图片

  • handler处理链中的处理方法是串行化执行的
  • 一个客户端连接只注册到一个NioEventLoop上,避免了多个IO线程并发操作

你可能感兴趣的:(netty)