任务队列中的Task有3种典型使用场景
用户程序自定义的普通任务
- 比如有一个非常耗时长的业务
- 异步执行
- 提交该Channel对应的NioEventLoop的TaskQueue中
用户自定义定时任务
- 该任务提交到scheduleTaskQueue中
非当前Reactor线程调用Channel的各种方法
- 例如在推送系统的业务线程里面,根据用户的标识,找到对应的 Channel 引用,然后调用 Write 类方法向该用户推送消息,就会进入到这种场景。最终Write会提交到任务队列中后被异步消费
Netty线程模型再说明
- Netty抽象出两组线程池,BossGroup专门负责接收客户端连接,WorkerGroup专门负责网络读写操作。
- NioEventLoop表示一个不断循环执行处理任务的线程,每个NioEventLoop都有一个selector,用于监听绑定在其上的socket网络通道。
- NioEventLoop内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由IO线程NioEventLoop负责
- 结构
- NioEventLoopGroup下包含多个NioEventlLoop
- 每个NioEventLoop中包含有一个Selector,一个TaskQueue
- 每个NioEventLoop的Selector上可以注册监听多个NioChannel
- 每个NioChannel只会绑定在唯一的NioEventLoop上
- 每个NioChannel都绑定有一个自己的ChannelPipeline