并发编程 | Netty - [Reactor 模型]

@

§1 模型中涉及的对象

下面信息只用来辅助理解下面的模型,具体信息参考 并发编程 | Netty - [常用组件概要]

NioEventLoop

  • 每个 NioEventLoop 包含一个 Selector
    相当于经典 Reactor 模型中一个 Reactor + Handler
  • 保持有一个任务队列,每一轮轮询并处理事件后,可以执行其中的任务
  • 以事件循环的方式处理绑定在其中的 Socket
    • select:监听绑定的 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 中各个方法的通用参数
    含有 Pipelinechannel地址 等信息

§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 上可以获得 PipelinePipeline 上也可以获得 NioSocketChannel
  • Netty 会通过 NioEventLoopGroup 中配置的 ChannelHandler 处理事件
posted @ 2025-05-20 14:57  问仙长何方蓬莱  阅读(12)  评论(0)    收藏  举报