Netty 权威指南笔记(四):架构剖析
2017-11-02 12:54
218 查看
Netty 权威指南笔记四架构剖析
Netty 逻辑架构
关键架构质量属性
高性能
高可靠
可定制易扩展
Reactor 通信调度层:由一系列辅助类组成,包括 Reactor 线程 NioEventLoop 及其父类,NioSocketChannel 和 NioServerSocketChannel 等等。该层的职责就是监听网络的读写和连接操作,负责将网络层的数据读到内存缓冲区,然后触发各自网络事件,例如连接创建、连接激活、读事件、写事件等。将这些事件触发到 pipeline 中,由 pipeline 管理的职责链来进行后续的处理。
职责链 ChannelPipeline:负责事件在职责链中的有序传播,以及负责动态地编排职责链。职责链可以选择监听和处理自己关心的事件,拦截处理和向后传播事件。
业务逻辑编排层:业务逻辑编排层通常有两类,一类是纯粹的业务逻辑编排,一类是应用层协议插件,用于特定协议相关的会话和链路管理。由于应用层协议栈往往是开发一次到处运行,并且变动较小,故而将应用协议到 POJO 的转变和上层业务放到不同的 ChannelHandler 中,就可以实现协议层和业务逻辑层的隔离,实现架构层面的分层隔离。
采用异步非阻塞的 I/O 类库,基于 Reactor 模式实现,解决了传统同步阻塞 I/O 模式下服务端无法平滑处理客户端线性增长的问题。
TCP 接收和发送缓冲区采用直接内存代替堆内存,避免了内存复制,提升了 I/O 读取和写入性能。
支持通过内存池的方式循环利用 ByteBuf,避免了频繁创建和销毁 ByteBuf 带来的性能消耗。
可配置的 I/O 线程数目和 TCP 参数等,为不同用户提供定制化的调优参数,满足不同的性能场景。
采用环形数组缓冲区,实现无锁化并发编程,代替传统的线程安全容器或锁。
合理使用线程安全容器、原子类等,提升系统的并发能力。
关键资源的使用采用单线程串行化的方式,避免多线程并发访问带来的锁竞争和额外的 CPU 资源消耗问题。
通过引用计数器及时地释放不再被引用的对象,细粒度的内存管理降低了 GC 的频率,减少频繁 GC 带来的时延增大和 CPU 损耗。
读空闲超时机制:连续 T 周期没有消息可读时,发送心跳消息,进行链路检测。如果连续 N 个周期没有读取到心跳消息,可以主动关闭链路,重建连接。
写空闲超时机制:连续 T 周期没有消息需要发送时,发送心跳消息,进行链路检测。如果连续 N 个周期没有读取对方发回的心跳消息,可以主动关闭链路,重建连接。
内存保护机制:Netty 提供多种机制对内存进行保护,包括以下几个方面:
通过对象引用计数器对 ByteBuf 进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护。
可设置的内存容量上限,包括 ByteBuf、线程池线程数等,避免异常请求耗光内存。
优雅停机:优雅停机功能指的是当系统推出时,JVM 通过注册的 Shutdown Hook 拦截到退出信号量,然后执行推出操作,释放相关模块的资源占用,将缓冲区的消息处理完成或清空,将待刷新的数据持久化到磁盘和数据库中,等到资源回收和缓冲区消息处理完成之后,再退出。
基于接口的开发:关键的类库都提供了接口或抽象类,便于用户自定义实现。
提供大量的工厂类,通过重载这些工厂类,可以按需创建出用户需要的对象。
提供大量系统参数供用户按需设置,增强系统的场景定制性。
总结,是为了强化学习效果。
Netty 逻辑架构
关键架构质量属性
高性能
高可靠
可定制易扩展
Netty 权威指南笔记(四):架构剖析
对 Netty 的架构进行剖析,学习其设计,便于在今后的架构设计中,设计出高性能、高可靠、可扩展的产品。Netty 逻辑架构
Netty 采用了典型的三层网络架构进行设计和开发,其逻辑架构如下图所示:Reactor 通信调度层:由一系列辅助类组成,包括 Reactor 线程 NioEventLoop 及其父类,NioSocketChannel 和 NioServerSocketChannel 等等。该层的职责就是监听网络的读写和连接操作,负责将网络层的数据读到内存缓冲区,然后触发各自网络事件,例如连接创建、连接激活、读事件、写事件等。将这些事件触发到 pipeline 中,由 pipeline 管理的职责链来进行后续的处理。
职责链 ChannelPipeline:负责事件在职责链中的有序传播,以及负责动态地编排职责链。职责链可以选择监听和处理自己关心的事件,拦截处理和向后传播事件。
业务逻辑编排层:业务逻辑编排层通常有两类,一类是纯粹的业务逻辑编排,一类是应用层协议插件,用于特定协议相关的会话和链路管理。由于应用层协议栈往往是开发一次到处运行,并且变动较小,故而将应用协议到 POJO 的转变和上层业务放到不同的 ChannelHandler 中,就可以实现协议层和业务逻辑层的隔离,实现架构层面的分层隔离。
关键架构质量属性
Netty 是一个高性能的、高可靠的、可扩展的异步通信框架,那么高性能、高可靠、可扩展设计体现在哪里呢?高性能
性能是设计出来的,而不是测试出来的。那么,Netty 的架构设计是如何实现高性能的呢?采用异步非阻塞的 I/O 类库,基于 Reactor 模式实现,解决了传统同步阻塞 I/O 模式下服务端无法平滑处理客户端线性增长的问题。
TCP 接收和发送缓冲区采用直接内存代替堆内存,避免了内存复制,提升了 I/O 读取和写入性能。
支持通过内存池的方式循环利用 ByteBuf,避免了频繁创建和销毁 ByteBuf 带来的性能消耗。
可配置的 I/O 线程数目和 TCP 参数等,为不同用户提供定制化的调优参数,满足不同的性能场景。
采用环形数组缓冲区,实现无锁化并发编程,代替传统的线程安全容器或锁。
合理使用线程安全容器、原子类等,提升系统的并发能力。
关键资源的使用采用单线程串行化的方式,避免多线程并发访问带来的锁竞争和额外的 CPU 资源消耗问题。
通过引用计数器及时地释放不再被引用的对象,细粒度的内存管理降低了 GC 的频率,减少频繁 GC 带来的时延增大和 CPU 损耗。
高可靠
链路有效性检测:由于长连接不需要每次发送消息都创建链路,也不需要在消息完成交互时关闭链路,因此相对于短连接性能更高。为了保证长连接的链路有效性,往往需要通过心跳机制周期性地进行链路检测。使用心跳机制的原因是,避免在系统空闲时因网络闪断而断开连接,之后又遇到海量业务冲击导致消息积压无法处理。为了解决这个问题,需要周期性地对链路进行有效性检测,一旦发现问题,可以及时关闭链路,重建 TCP 连接。为了支持心跳,Netty 提供了两种链路空闲检测机制:读空闲超时机制:连续 T 周期没有消息可读时,发送心跳消息,进行链路检测。如果连续 N 个周期没有读取到心跳消息,可以主动关闭链路,重建连接。
写空闲超时机制:连续 T 周期没有消息需要发送时,发送心跳消息,进行链路检测。如果连续 N 个周期没有读取对方发回的心跳消息,可以主动关闭链路,重建连接。
内存保护机制:Netty 提供多种机制对内存进行保护,包括以下几个方面:
通过对象引用计数器对 ByteBuf 进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护。
可设置的内存容量上限,包括 ByteBuf、线程池线程数等,避免异常请求耗光内存。
优雅停机:优雅停机功能指的是当系统推出时,JVM 通过注册的 Shutdown Hook 拦截到退出信号量,然后执行推出操作,释放相关模块的资源占用,将缓冲区的消息处理完成或清空,将待刷新的数据持久化到磁盘和数据库中,等到资源回收和缓冲区消息处理完成之后,再退出。
可定制、易扩展
责任链模式:ChannelPipeline 基于责任链模式开发,便于业务逻辑的拦截、定制和扩展。基于接口的开发:关键的类库都提供了接口或抽象类,便于用户自定义实现。
提供大量的工厂类,通过重载这些工厂类,可以按需创建出用户需要的对象。
提供大量系统参数供用户按需设置,增强系统的场景定制性。
总结,是为了强化学习效果。
相关文章推荐
- Netty 权威指南笔记(八):EventLoopGroup 和线程模型
- Netty 权威指南笔记(二):Java NIO 和 Netty 对比
- Java互联网架构Netty、Nio、Mina权威指南
- Netty 权威指南笔记(三):TCP 粘包和拆包
- Netty 权威指南笔记(六):Channel 解读
- Netty 权威指南笔记(五):ByteBuf 源码解读
- Netty 权威指南笔记(七):ChannelPipeline 和 ChannelHandler 源码分析
- Netty 权威指南笔记(一):网络 I/O 模型和 Java NIO 入门
- HTML5权威指南笔记:19-使用边框和背景
- JS权威指南笔记之数据类型
- Cocos2d-X权威指南笔记
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
- Cotex-M3权威指南学习笔记--NVIC与中断控制一
- armcm3权威指南笔记
- ES权威指南[官方文档学习笔记]-7 finding your feet
- ES权威指南[官方文档学习笔记]-33 Updating a whole document
- ES权威指南[官方文档学习笔记]-17 Tutorial Conclusion
- angular js权威指南笔记四--内置指令
- maven权威指南学习笔记(三)——一个简单的maven项目
- juqery权威指南学习笔记-1