- reactor单线程模型
- reactor多线程模型
- 主从reactor多线程模型
- Netty线程模型
1 reactor单线程模型
使用的是异步非阻塞I/O,所有的I/O都是不会导致阻塞的。通过Acceptor类接收客户端的TCP连接请求消息,当链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上,进行消息解码,用户线程消息编码后通过NIO线程将消息发送给客户端,适用于小容量模型的系统应用。
所有的I/O操作都在同一个NIO线程上面完成。
NIO线程的职责:
- 作为NIO服务端,接收客户端的TCP连接
- 作为NIO客户端,向服务端发起TCP连接
- 读取通信对端的请求或者应答消息
2 reactor多线程模型
与单线程模型最大的区别是,有一组NIO线程来处理I/O操作,有一个专门NIO线程——Acceptor线程用于监听服务端,接收客户端的TCP连接请求,网络I/O操作有一个NIO线程池负责,在这类场景下,单独一个Acceptor线程可能会存在性能不足的问题。
3 主从reactor多线程模型
Acceptor线程池用于客户端登录、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的I/O线程上。主线程池用于接收请求,完成登录检验,子线程池负责后续I/O操作。
4 Netty线程模型
- 相关概念
- EventLoop的启动
- Bind绑定端口过程
- Channel概念
4.1 相关概念
可以同时支持以上三种模型,取决于用户的启动参数配置,调整线程池的线程个数等。
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try{
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.channel(ChannelOption.SO_BACKLOG,100)
.handler(new LoggingHandler(LogLevel.INFO)
.childHandler(new ChannelInitializer<SocketChannel>(){
bossGroup职责
- 接受客户端TCP连接,初始化Channel参数
- 将链路状态变更时间通知给ChannelPipeline
worker职责
- 异步读取数据报,发送读事件到ChannelPipeline
- 异步发送消息到通信对端,调用ChannelPipeline的消息发送端口
- 执行系统调用Task
- 执行定时任务Task,例如链路空缺状态监测定时任务
NioEventLoopGroup是线程组,包含了一组NIO线程,专门用于处理网络事件,实际上是reactor线程组,bossGroup用于服务端接受客户端的连接,workGroup用于进行socketChannel的网络读写。
ServerBootstrap用于启动服务端的辅助启动类,目的是降低服务端的开发复杂度。
4.2 EventLoop的启动
EventLoop自身实现了Executor接口,当调用executor方法提交任务时,这判断是否启动,未启动则调用内置的executor创建新线程来触发run方法执行。
4.3 Bind绑定端口过程
4.4 Channel概念
netty中的Channel是一个抽象的概念,可以理解为对JDK NIO Channel的增强和拓展。
AbstractChannel | 描述 |
---|---|
-pipeline DefaultChannelPipeline | 通道内事件处理链路 |
-eventLoop EventLoop | 绑定的EventLoop,用于执行操作 |
-unsafe Unsafe | 提供I/O相关操作的封装 |
#config() ChannelConfig | 返回通道配置信息 |
+read() Channel | 开始读数据,触发读取链路调用 |
+write(Object msg) ChannelFuture | 写数据,触发链路调用 |
+bind(SocketAddress SocketAddress) ChannelFuture | 绑定 |
参考文章
结语
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~