Netty-基础篇(4)
不使用Java原生NIO编程的原因
1、NIO的类库和API复杂,使用麻烦
2、需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程
3、可靠性能力补齐,工作量和难度都非常大。例如客户端面临断线重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题。
4、JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU100%。官方声称在JDK1.6版本的update18修复了该问题,但是知道JDK1.7版本该问题依然存在,只是概率降低了。
三层网络架构
1.Reactor通信调度层
2.职责链ChannelPipeline
3.业务逻辑编排层(Service ChannelHandler)
线程模型
Reactor,NIO框架对于Reactor实现本质上还是遵循其基础线程模型
单线程模型
指所有的I/O操作都在同一个NIO线程上面完成
多线程模型
特点:
1.有专门一个NIO线程——Acceptor线程用于监听服务端,接收客户端的TCP连接请求
2.网络I/O操作——读、写由一个NIO线程负责,线程池可以采用标准的JDK线程池实现,它包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送
3.一个NIO线程可以同时处理N条链路,但是一个链路只对应一个NIO线程,防止发生并发操作问题
主从多线程模型
1.服务端用于接收客户端连接的不再是一个单独的NIO线程,而是一个独立的NIO线程池
2.可以解决一个服务端监听线程无法有效处理所有客户端连接的性能不足问题
Netty线程模型
支持Reactor单线程模型、多线程模型、主从多线程模型