Reactor模型
Reactor 是一种事件驱动设计模式,用于处理一个或多个客户端并发交付的服务请求。
核心思想是:
解耦:将事件分发(dispatching)与事件处理(handling)分离
非阻塞 I/O:基于 NIO
核心组件
| 组件 | 职责 | 对应类 |
|---|---|---|
| Reactor | 监听和分发事件 | EventLoop / EventLoopGroup |
| Acceptor | 处理新连接请求 | ServerBootstrapAcceptor |
| Handler | 执行业务逻辑 | ChannelHandler 链 |
| Selector | 多路复用器 | Java NIO Selector |
工作流程
- 启动阶段
└── bossGroup 注册 ServerSocketChannel 到 Selector
└── 监听 OP_ACCEPT 事件 - 连接建立
└── 客户端连接 → Selector 感知 OP_ACCEPT
└── bossGroup 的 EventLoop 执行 accept()
└── 创建 SocketChannel,注册到 workerGroup 的 Selector - 数据读写
└── 数据到达 → workerGroup 的 Selector 感知 OP_READ
└── EventLoop 读取数据 → 触发 ChannelRead 事件
└── 在 Handler 链中传播处理 - 业务处理
└── 耗时操作可提交到业务线程池(避免阻塞 I/O 线程)
关键设计
无锁串行化设计
单个 Channel 的所有 I/O 操作由同一个 EventLoop 线程执行
避免多线程竞争,无需加锁
零拷贝(Zero-Copy)
使用堆外内存(Direct Buffer)
通过 CompositeByteBuf 组合缓冲区,减少数据拷贝
内存池化
PooledByteBufAllocator 复用缓冲区
减少 GC 压力
责任链模式
ChannelPipeline 组织 Handler
事件在链中传播,解耦业务逻辑