chapter20 Netty架构剖析
1. Netty逻辑架构
- Reactor通信调度层
- 一系列辅助类完成,包括Reactor线程NioEventLoop及其父类,NioSocketChannel、NioServerSocketChannel及其父类,ByteBuffer、Buffer、Unsafe等
- 主要职责是监听网咯的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件到PipeLine中。
- 职责链ChannelPipeline
- 负责事件在职责链中有序传播,同时负责动态地编排职责链。上层业务只需要关心处理业务,不需要感知底层的协议差异和线程模型差异,实现架构层面的分层隔离。
- 业务逻辑编排层(service ChannelHandler)
- 两类:一类是纯粹的业务逻辑编排,还有一类是其他的应用层协议插件,用于特定协议相关的会话和链路管理。
2. 关键架构质量属性
高性能
- 采用异步非阻塞IO,基于Reactor模式实现
- TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复制,提升IO的读写性能
- 支持通过内存池的方式循环利用ByteBuf,避免了创建和销毁ByteBuf带来的性能损耗
- 可配置的IO线程数、TCP参数等
- 采用环形数组缓冲区实现无锁化并发编程,代替传统的线程安全容器或者锁。
- 合理地使用线程安全容器、原子类等
- 关键资源的处理使用单线程串行化的方式,避免多线程并发带来的锁竞争和额外的cpu资源消耗问题
- 通过引用计数器及时地申请释放不再被引用的对象,细粒度的内存管理降低了GC的频率,减少了频繁GC带来的时延增大和cpu损耗
可靠性
- 链路有效性检测[心跳检测]
- Netty提供的两种链路空闲检测机制:
- 读空闲超时机制:当连续周期T没有消息可读时,触发超时Handler,用户可以基于读空闲超时发送心跳消息,进行链路检测;如果连续N个周期仍然没有读取到心跳消息,可主动关闭链路。
- 写空闲超时机制:同上,在没有发送消息时进行检测
- 内存保护机制
- 通过对象引用计数器对Netty的ByteBuf灯内置对象进行细粒度的内存申请和释放,对非对象引用进行检测和保护
- 通过内存池来重用ByteBuf,节省内存
- 可设置的内存容量上限,包括ByteBuf、线程池线程数等
- 优雅停机
- 优雅停机往往需要设置个最大超时时间T,如果达到T后系统仍然没有退出,则通过Kill -9 pid强杀当前的进程
- Netty所有涉及到资源回收和释放的都提供了接口实现优雅停机
- 可定制性
- 责任链模式,ChannelPipeline基于责任链模式开发
- 基于接口的开发,关键的类库都提供了接口或者抽象类
- 提供了大量工厂类,通过重载这些工厂类可以按需创建出用户实现的对象
- 提供了大量的系统参数供用户按需设置
- 可扩展性
- 扩展协议栈不需要修改Netty源码,直接基于二进制类库即可实现协议的扩展和定制。
- 链路有效性检测[心跳检测]