天天看点

Netty线程模型总结

netty是一个异步的,事件驱动的基于NIO的高性能的网络应用程序框架,下面主要看看netty的线程模型.

Netty线程模型

Netty线程模型总结
  1. netty的线程模型是基于reactor模式的一种实现
  2. 如果服务只需要绑定一个端口(比如8888),那么boss线程只需要一个线程,如果有多个才需要多个线程,一个NioEventLoop负责一个端口
  3. 服务启动时会创建两个线程组 bossGroup 和 workGroup, 对应NioEventLoopGroup, 一个NioEventLoopGroup可以有多个 NioEventLoop,一个NioEventLoop 有一个 Thread 和 Selector.
  4. boss线程组的acceptor线程处理accept事件,生成NioServerChannel 注册到 work线程组的某个 selecor上,由work线程处理连接上的读写事件。
  5. selector负责轮询可读,可写事件,当有可读可写事件时调用channelpipeline的handler进行处理。
  6. netty采用了串行化设计,channel的消息从读取、编码以及后续Handler的执行,始终都由一个IO线程EventLoop负责,减少线程上下文切换带来的开销,避免并发风险。

对比reactor模式

  • NioEventLoop 相当于 reactor中的 Initiation Dispatcher  (初始分发器)
  • ChannelHandler 相当于reactor中的 Event Handler  (事件处理者)
  • Selector 相当于reactor中的 Synchronous Event Demultiplexer  (同步事件分离器)
  • NioSocketChannel 相当于 ractor中的 handle (句柄或描述符)
  • netty的线程模型类似于reactor的主从多reactor模式,只是从reactor其实有多个,一个NioEventLoop相当于一个reactor,负责一部分channel。而reactor的线程池对应于netty的用户自定义线程池。

Reactor模式

Reactor 是一种服务端应用处理IO事件的设计模式,目的是提高服务端程序的并发能力.

reactor结构

Netty线程模型总结
  • Handle(句柄或描述符,在Windows下称为句柄,在Linux下称为描述符):本质上表示一种资源(比如说文件描述符,或是针对网络编程中的socket描述符),是由操作系统提供的;该资源用于表示一个个的事件,事件既可以来自于外部,也可以来自于内部;外部事件比如说客户端的连接请求,客户端发送过来的数据等;内部事件比如说操作系统产生的定时事件等。它本质上就是一个文件描述符,Handle是事件产生的发源地。
  • Synchronous Event Demultiplexer(同步事件分离器):它本身是一个系统调用,用于等待事件的发生(事件可能是一个,也可能是多个)。调用方在调用它的时候会被阻塞,一直阻塞到同步事件分离器上有事件产生为止。对于Linux来说,同步事件分离器指的就是常用的I/O多路复用机制,比如说select、poll、epoll等。在Java NIO领域中,同步事件分离器对应的组件就是Selector;对应的阻塞方法就是select方法。
  • Event Handler(事件处理器):本身由多个回调方法构成,这些回调方法构成了与应用相关的对于某个事件的反馈机制。在Java NIO领域中并没有提供事件处理器机制让我们调用或去进行回调,是由我们自己编写代码完成的。Netty相比于Java NIO来说,在事件处理器这个角色上进行了一个升级,它为我们开发者提供了大量的回调方法,供我们在特定事件产生时实现相应的回调方法进行业务逻辑的处理,即,ChannelHandler。ChannelHandler中的方法对应的都是一个个事件的回调。
  • Concrete Event Handler(具体事件处理器):是事件处理器的实现。它本身实现了事件处理器所提供的各种回调方法,从而实现了特定于业务的逻辑。它本质上就是我们所编写的一个个的处理器实现。
  • Initiation Dispatcher(初始分发器):实际上就是Reactor角色。它本身定义了一些规范,这些规范用于控制事件的调度方式,同时又提供了应用进行事件处理器的注册、删除等设施。它本身是整个事件处理器的核心所在,Initiation Dispatcher会通过Synchronous Event Demultiplexer来等待事件的发生。一旦事件发生,Initiation Dispatcher首先会分离出每一个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件。Netty中ChannelHandler里的一个个回调方法都是由bossGroup或workGroup中的某个EventLoop来调用的。

reactor的三种实现

Netty线程模型总结

上图是单线程实现,一个线程负责所有事情

Netty线程模型总结

上图是线程池实现,将非IO事件交由线程池处理,reactor线程负责io事件

Netty线程模型总结

上图是主从reactor实现,主reactor负责接收链接,从reactor负责之后的io读写