Worker EventLoop接收到的如果是耗时任务,这时候交给一个线程池去处理这个任务。最主要的是如何让Worker EventLoop或者设备知道已经处理完了,或者说Worker EventLoop提交耗时任务给线程池是要携带上下文过去,让这个线程池处理完任务的时候能通知Worker EventLoop或设备。

流程

Worker EventLoop
→ 提取并复制业务上下文
→ 提交Business Executor
→ 立即继续处理其他连接
→ Business Executor完成
→ 通过Future/Callback通知
→ 将完成任务重新提交给Channel EventLoop
→ EventLoop检查连接状态
→ 编码并发送响应
→ 设备收到协议响应

ex

Worker EventLoop

负责网络I/O:

Selector轮询
Socket读取
ByteBuf读取
协议解码
Pipeline事件
Socket写出
连接关闭
心跳事件

点:

  • 和Channel绑定
  • 一个EventLoop管理多个Channel
  • 必须快速执行
  • 不能长时间阻塞
  • 保证同一Channel的事件顺序

Business Executor

负责慢业务:

MySQL查询
同步Redis调用
远程HTTP请求
文件读写
复杂计算
同步等待Kafka结果

特点:

  • 不负责监听Socket
  • 不负责Selector
  • 不直接拥有Channel
  • 用来隔离慢任务
  • 可以有独立线程数和任务队列
  • 处理完成后把结果交还给Channel

对比:

项目Worker EventLoopBusiness Executor
是否管理Channel是否
是否管理Selector是否
是否处理Socket读写是否
是否可以长时间阻塞不应该可以有限阻塞
是否保证连接I/O顺序是需要设计
线程数量依据CPU和网络负载数据库、外部服务和阻塞比例
主要职责网络和协议业务处理