Netty线程模型

156 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

Netty的线程模型

1、Reactor反应式模型:

这种模型核心就是两大组件,Reactor反应器和Handler处理器;

Reactor负责处理响应io时间,分发到Handler处理器处理;

Reactor模式可以分成三种不同的类别

  1. 单Reactor单线程模式:

    Reactor中有两个部分 selector和Dispacther分发器,Selector负责阻塞监听来自客户端的事件,收到事件请求通过分发器分发给对应Handler处理器;

    这种模型就一个处理线程,串行化执行,不存在先线程之间的竞争问题;

    但是同时在消息量大时候,单线程无法发挥多核xpu的能力,同一时间找你呢个表处理一个事件,与此同时其他时间就必须要等待,如果处理当前事件线程出现了死循环或者意外挂掉了,那么后面的事件都得不到处理;

  2. 单Reactor多线程处理

    同样的Reactor 对象通过 selector 监控客户端请求事件, 收到事件后,通过 dispatch 进行分发给Handler处理,但是此时handler处理器不做真正的业务处理,而指做出响应,将真正的业务处理交给下层的worker线程组处理;

  3. 主从Reactor多线程

    这种模型中引入从Reacrot的概念,MainReactor负责监听来自客户端连接时间,它只处理来自客户端的accep事件,处理完accept事件之后把这个连接信息交给SubReacrot处理,

    subReactor负责监听该连接上的IO事件,然后就是监听这些连接的io事件,并且交给Handler处理器,最终交给worker线程组处理;

    目前netty的线程模型就是依据这种线程迷行演化而来;

Netty的线程模型

Netty模型抽象出两组线程池: BossNioEventLoopGroup 和 WorkerNioEventLoopGroup线程池。

每个线程池内部都是循环 NioEventLoop 线程

BossGroup 中的线程专门负责和客户端建立连接,WorkerGroup 中的 线程专门负责处理连接上的IO事件。BossGroup 和 WorkerGroup 的类型都是 NioEventLoopGroup NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环就 是一个 NioEventLoop NioEventLoop 表示一个不断循环的执行事件处理的线程,每个 NioEventLoop 都包含一个 Selector,用于监听注册在其上的 Socket 网络连接(Channel) NioEventLoopGroup 可以含有多个线程,即可以含有多个 NioEventLoop 每个 BossNioEventLoop 中循环执行以下三个步骤 select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件) processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上 runAllTasks:再去以此循环处理任务队列中的其他任务 每个 WorkerNioEventLoop 中循环执行以下三个步骤 select:轮训注册在其上的 NioSocketChannel 的 read/write 事件 (OP_READ/OP_WRITE 事件) processSelectedKeys:在对应的 NioSocketChannel 上处理 read/write 事件 runAllTasks:再去以此循环处理任务队列中的其他任务 在以上两个processSelectedKeys步骤中,会使用 Pipeline(管道),Pipeline 中引用了 Channel,即通过 Pipeline 可以获取到对应的 Channel,Pipeline 中维护了很多的处理器 (拦截处理器、过滤处理器、自定义处理器等)。