《netty实战》读书笔记二--reactor模型、处理流程、pipeline功能、异步模型

128 阅读3分钟

netty模型:

 

  1. netty抽象出两组线程池BossGroup专门负责接收客户端的连接,WorkGroup专门负责网络的读写
  2. BossGroup和WorkGroup类型都是NIOEventLoopGroup
  3. NIOEventLoopGroup相当于一个事件循环组,这个组中有多个事件循环,每个事件循环是NIOEventLoop
  4. NIOEventLoop表示一个不断循环的执行处理任务的线程,每个NIOEventLoop都有一个selector,用于监听绑定在其上的socket的网络通讯
  5. NIOEventLoopGroup可以有多个线程,即可以含有多个NIOEventLoop
  6. 每个BossNIOEventLoop的执行步骤有3步:
    1.轮询accept事件
    2.处理accept事件,与client建立连接生成NIOSocketChannel,并将其注册到某个worker NIOEventLoop上的selector上去(根据他的算法)
    3.处理任务队列的任务,即runAllTasks
  7. 每个Worker NIOEventLoop循环执行的步骤
    1.轮询read、write事件
    2.处理IO事件,即read、write事件,在对应的NIOSocketChannel上进行处理
    3.处理任务队列的任务,即runAllTasks
  8. 每个worker NIOEventLoop在处理业务时,会使用到pipeline(管道),pipeline中包含了channel,即通过pipeline可以获取到对应的通道。pipeline中维护了很多的处理器

netty处理流程:

  1. Netty 抽象出两组线程池,BossGroup 专门负责接收客户端连接,WorkerGroup 专门负责网络读写操作。
  2. NioEventLoop 表示一个不断循环执行处理任务的线程,每个 NioEventLoop 都有一个 selector,用于监听绑定在其上的 socket 网络通道。
  3. NioEventLoop 内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由 IO 线程 NioEventLoop 负责 NioEventLoopGroup 下包含多个 NioEventLoop

 每个 NioEventLoop 中包含有一个 Selector,一个 taskQueue

 每个 NioEventLoop 的 Selector 上可以注册监听多个 NioChannel

 每个 NioChannel 只会绑定在唯一的 NioEventLoop 上

 每个 NioChannel 都绑定有一个自己的 ChannelPipeline

pipeline功能:

  • pipeline的适配器里面有一个ChannelHandlerContext上下文对象,含有管道pipeline、通道channel、地址
  • 用户程序自定义的普通任务:ctx.channel().eventLoop().execute(。。。); 用户自定义定时任务:ctx.channel().eventLoop().schedule(。。。); 非当前Reactor线程调用channel的各种方法:initChannel开始的时候将用户标识与socketChannel绑定(例如HashMap)

netty的异步模型:

 

  1. 表示异步的执行结果, 可以通过它提供的方法来检测执行是否完成,比如检索计算等等.
  2. ChannelFuture 是一个接口 :我们可以添加监听器,当监听的事件发生时,就会通知到监听器.
  3. 在使用 Netty 进行编程时,拦截操作和转换出入站数据只需要您提供 callback 或利用future 即可。这使得链式操作简单、高效, 并有利于编写可重用的、通用的代码。 
  4. Netty 框架的目标就是让你的业务逻辑从网络基础应用编码中分离出来、解脱出来
  5. future-listener:相比传统阻塞 I/O,执行 I/O 操作后线程会被阻塞住, 直到操作完成;异步处理的好处是不会造成线程阻塞,线程在 I/O 操作期间可以执行别的程序,在高并发情形下会更稳定和更高的吞吐量