Netty的Reactor多线程模型,NioEventLoop,

2020-01-09  本文已影响0人  alonwang

前言

Reactor多线程

如果在Google上搜索"Netty 高性能 易用",在找到的一大批文章,你大概率会看到这张图,外加关键字

NIO,Reactor多线程模型,异步串行无锁化,堆外内存,pipeline ,翻看完这些文章后可以让你对Netty的原理有大致了解,但是Netty如何实现这些的呢? 本文将尽可能简单的解释Netty中Reactor多线程的实现,如有错误感谢指出.

Selector

Selector是NIO的重要组件, Selector上可以注册Channel. Channel在注册的时候会标注自己感兴趣的事件:

Channel,通道,为了便于理解,我把它分为三类

Reactor多线程模型

Reactor多线程

Reactor多线程模型可以分为三块

mainReactor负责客户端接入

  1. serverSocketChannel注册到mainSelector上,监听新连接接入(OP_ACCEPT)
  2. client1开始连接
  3. mainSelector通知serverSocketChannel有新连接接入

acceptor负责将接入的连接移交给subReactor

  1. serverSocketChannel接受新连接,获得socketChannel

  2. socketChannel按照规则(轮询调度)注册到subSelector{n}上,监听读事件(OP_READ)

subReactor负责连接的读写

  1. client发送数据

  2. subSelector通知SocketChannel有数据到达,socketChannel做相应的业务处理

  3. socketChannel需要对client发送数据,先向subSelector监听可写事件(OP_WRITE).

  4. subSelector通知socketChannel可写,socketChannel进行相应的业务处理

关键知识:

NioEventLoop

NioEventLoop
NioEventLoop就是对Reactor的封装. EventLoopGroup的基本组成如下图,结合Reactor模型,上面的mainReactor就是只有一个NioEventLoop的NioEventLoopGroup(为什么只有一个? 因为ServerSocketChannel只有一个),subReactor就是有多个NioEventLoop的EventLoopGroup

运行流程图

NioEventLoop运行流程

关键知识:

ChannelPipeline

ChannelPipeline

ChannelPipeline的设计思想是责任链设计模式,是由ChannelHandlerContext组成的双向链表, ,首尾固定为HeadContextTailContext,它们作为哨兵存在.当我们添加一个ChannelHandler到ChannelPipeline时,会先包装成ChannelHandlerContext再添加进去.

inbound事件传播

客户端向服务端发送消息,这个流向就称为inbound. 消息会从Head开始由左向右传递直到Tail,由Tail进行收尾操作

outbound事件传播

服务端向客户端发送信息,这个流向称为outbound,消息会从Tail开始由右向左传递知道Head,由Head进行收尾操作

异常传递

当某个ChannelHandler操作抛出异常,会从该handler开始向Tail传递.由Tail做收尾操作.

结语

学习Netty,要理解Reactor模型,并把它和Netty的实现结合起来, 我学习Netty的时候就因为这块认识不深刻,浪费了很多时间也没有成效,共勉


https://blog.csdn.net/difffate/article/details/69458588

https://blog.csdn.net/jjzhk/article/details/39553613

https://www.jianshu.com/p/a9b2fec31fd1

https://www.jianshu.com/p/a9d030fec081

https://juejin.im/post/5b4570cce51d451984695a9b

https://www.jianshu.com/p/2461535c38f3

https://juejin.im/post/5a126b146fb9a0450c490201

上一篇下一篇

猜你喜欢

热点阅读