并发编程 | Netty - [Reactor 模型]
@
§1 模型中涉及的对象
下面信息只用来辅助理解下面的模型,具体信息参考 并发编程 | Netty - [常用组件概要]
NioEventLoop
- 每个
NioEventLoop包含一个Selector
相当于经典 Reactor 模型中一个 Reactor + Handler - 保持有一个任务队列,每一轮轮询并处理事件后,可以执行其中的任务
- 以事件循环的方式处理绑定在其中的
Socketselect:监听绑定的Socket的关注事件processSelectedKeys:处理选中的 key,即处理就绪的事件runAllTasks:执行任务队列中的所有任务
NioEventLoopGroup
- 可以包含多个
NioEventLoop - 分为两组
BossGroup:负责 accept,通常只有一个WorkerGroup:负责读写,通常有多个
NioSocketChannel
- 绑定在
NioEventLoop上的Socket通道的实际类型 - 每个
NioSocketChannel包含一个Pipeline
Pipeline
WorkerGroup在处理业务时会使用Pipeline- 包含了
Channel - 每个
Pipeline维护一个ChannelHandler队列 - 通常不同
Pipeline中的ChannelHandler不共享
技术上是可以做到共享的,但是一旦共享就需要处理线程安全问题,影响性能
ChannelHandler
- 用于实际处理业务
- 一个业务可能通过多个
ChannelHandler处理
ChannelInboundHandlerAdapter
- 通道入站 handler 适配器
- handler 适配器可以辅助通道方法的实现
ChannelHandlerContext
- 是
ChannelInboundHandlerAdapter中各个方法的通用参数
含有Pipeline、channel、地址等信息
§2 从经典 Reactor 到 Netty Reactor
整体模型

分部模型
Netty 的工作模型是从 Reactor 上演化出来的,在 主从 Reactor 模型 的基础上
- 将一个 Reactor 和它的线程包装为
NioEventLoop(但远不止封装一下这么简单) - 每个
NioEventLoop,对应 一条线程 NioEventLoop对注册在其中的连接 (实际为NioSocketChannel) 进行循环处理- 每一轮循环都由三个步骤组成,参考上文
NioEventLoop对象

- 处理时,可以从
NioSocketChannel上获取Pipeline对象Pipeline本身是一个ChannelHandler双向链表- 连接最终通过
Pipeline上的ChannelHandler协同处理

- 将一个或多个
NioEventLoop包装成NioEventLoopGroup NioEventLoopGroup是多线程的,默认包含 2 * 有效核数 的 child- 每个 child 都是一个
NioEventLoop

NioEventLoopGroup通常分为两组- boss-group:专用于处理连接,并将生成的新连接交由 workers-group
- workers-group:专用于处理各个连接的读写

- Netty 中处理的
Socket实际上会被包装为NioSocketChannel NioSocketChannel上可以获得Pipeline,Pipeline上也可以获得NioSocketChannel- Netty 会通过
NioEventLoopGroup中配置的ChannelHandler处理事件

浙公网安备 33010602011771号