Netty系列三:netty线程模型
netty使用reactor反应堆线程模型。
一、Reactor模型单线程模型如下:
- 用户发起IO操作到事件分离器
- 事件分离器调用相应的处理器处理事件
- 事件处理完成,事件分离器获得控制权,继续相应处理
二、Reactor模型多线程模型如下:
但单线程的Reactor模型每一个用户事件都在一个线程中执行:
- 性能有极限,不能处理成百上千的事件
- 当负荷达到一定程度时,性能将会下降
- 某一个事件处理器发送故障,不能继续处理其他事件
三、Reactor主从多现成模型
- Acceptor(boss线程池)不再是一个单独的NIO线程,而是一个独立的NIO线程池
- Acceptor(boss线程池)处理完后,将事件注册到IO线程池(work线程池)的某个线程上
- IO线程继续完成后续的IO操作
- Acceptor(boss线程池)仅仅完成登录、握手和安全认证等操作,IO(work线程池)操作和业务处理依然在后面的从线程中完成
NioEventLoop
NioEventLoop是Netty的Reactor线程,它在Netty Reactor线程模型中的职责如下:
- 作为服务端Acceptor线程,负责处理客户端的请求接入
- 作为客户端Connecor线程,负责注册监听连接操作位,用于判断异步连接结果
- 作为IO线程,监听网络读操作位,负责从SocketChannel中读取报文
- 作为IO线程,负责向SocketChannel写入报文发送给对方,如果发生写半包,会自动注册监听写事件,用于后续继续发送半包数据,直到数据全部发送完成
如下图,是一个NioEventLoop的处理链:
- handler处理链中的处理方法是串行化执行的
- 一个客户端连接只注册到一个NioEventLoop上,避免了多个IO线程并发操作
转载于:https://blog.****.net/cj2580/article/details/78124780