Worker EventLoop接收到的如果是耗时任务,这时候交给一个线程池去处理这个任务。最主要的是如何让Worker EventLoop或者设备知道已经处理完了,或者说Worker EventLoop提交耗时任务给线程池是要携带上下文过去,让这个线程池处理完任务的时候能通知Worker EventLoop或设备。
流程
Worker EventLoop
→ 提取并复制业务上下文
→ 提交Business Executor
→ 立即继续处理其他连接
→ Business Executor完成
→ 通过Future/Callback通知
→ 将完成任务重新提交给Channel EventLoop
→ EventLoop检查连接状态
→ 编码并发送响应
→ 设备收到协议响应

Worker EventLoop
负责网络I/O:
Selector轮询
Socket读取
ByteBuf读取
协议解码
Pipeline事件
Socket写出
连接关闭
心跳事件
点:
- 和Channel绑定
- 一个EventLoop管理多个Channel
- 必须快速执行
- 不能长时间阻塞
- 保证同一Channel的事件顺序
Business Executor
负责慢业务:
MySQL查询
同步Redis调用
远程HTTP请求
文件读写
复杂计算
同步等待Kafka结果
特点:
- 不负责监听Socket
- 不负责Selector
- 不直接拥有Channel
- 用来隔离慢任务
- 可以有独立线程数和任务队列
- 处理完成后把结果交还给Channel
对比:
| 项目 | Worker EventLoop | Business Executor |
|---|---|---|
| 是否管理Channel | 是 | 否 |
| 是否管理Selector | 是 | 否 |
| 是否处理Socket读写 | 是 | 否 |
| 是否可以长时间阻塞 | 不应该 | 可以有限阻塞 |
| 是否保证连接I/O顺序 | 是 | 需要设计 |
| 线程数量依据 | CPU和网络负载 | 数据库、外部服务和阻塞比例 |
| 主要职责 | 网络和协议 | 业务处理 |