高性能NIO通信框架之Netty架构总结(1)

一、Netty的高性能

Netty的架构设计是如何实现高性能的:

(1)采用异步非阻塞的I/O,基于Reactor模式实现(主从模式),解决了传统的同步阻塞I/O模式的服务端无法平滑地处理线性增长的客户端的问题

(2)TCP接收和发送缓冲区采用直接内存而非是堆内存,从而避免了内存复制,提升了I/O的读取和写入的性能

(3)支持通过内存池的方式循环利用ByteBuf,避免了频繁创建和销毁ByteBuf带来的性能损耗

(4)可配置的I/O线程数、TCP参数等,为不同的用户场景提供可定制话的调优参数,满足不同的性能场景

(5)采用环形数组的缓冲区实现无锁化并发编程,代替传统的线程安全容器或者锁

(6)合理地使用线程安全容器,原子类等,提升系统的并发处理能力

(7)关键资源的处理使用单线程串行化的方式,避免多线程并发访问带来的锁竞争和额外的CPU资源消耗问题

(8)通过引用计数器及时地申请释放不再被引用的对象,细粒度的内存管理降低了GC的频率,减少了频繁GC带来的时延增大和CPU损耗

 

二、Netty可靠性

   2.1 链路的有效性检测

   由于Netty是长连接不需要每次发送消息都创建链路,也不需要在消息交互完成时关闭链路,因此相对于短连接性能更高。对于长连接,维护链路的健康也是需要考虑的一方面。

   为了保证长连接的链路有效性,往往需要通过心跳机制周期性地进行链路检测。Netty提供了两种链路空闲时检测机制:

(1)读空闲超时机制:当连续周期T没有消息可读时,触发超时Handler,用户可以基于读空闲超时发送心跳消息,进行链路检测;如果连续N个周期仍然没有读取到心跳消息,可以主动关闭链路。

(2)写空闲超时机制:当连续周期T没有消息要发送时,触发超时Handler,用户可以基于写空闲超时发送心跳消息,进行链路检测;如果连续N个周期仍然没有接收到对方的心跳消息,可以主动关闭链路。

   为了满足不同用户场景的心跳机制,Netty提供了空闲状态检测事件通知机制,用户可以订阅空闲超时事件、写空闲超时事件、读或者写超时事件,在接收到对应的空闲事件之后,灵活地进行定制。

 

2.2  内存保护机制

Netty提供了一些内存保护机制,包括以下几个方面:

(1)通过对象引用计数器对NettyByteBuf等内置对象进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护

(2)通过内存池来重用ByteBuf,节省内存

(3)可设置的内存容量上限,包括ByteBuf、线程池线程数等

 

2.3 优雅停机

   优雅停机功能指的是当系统退出时,JVM通过注册的ShutDown Hook拦截到退出信号量,然后执行退出操作,释放相关模块的资源占用,将缓冲区的消息处理完成或者清空,将待刷新的数据持久化到磁盘或者数据库中,等到资源回收和缓冲区消息处理完成之后,再退出。

优雅停机往往需要设置个最大超时时间T,如果达到T后系统仍然没有退出,则通过kill -9 pid直接强杀当前进程。

Netty的所有涉及到资源回收和释放的地方都增加了优雅退出的方法。

 

三、Netty可定制性和可扩展性

Netty可定制性主要体现在如下几个方面:

(1)责任链模式:ChannelPipeline基于责任链模式开发,便于业务逻辑的拦截、定制和扩展。

(2)基于接口的开发:关键的类库都提供了接口或者抽象类,如果Netty自身的实现无法满足用户的需要,可以由用户自己定义,直接去实现相关的接口即可

(3)提供了大量工厂类,通过重载这些工厂类可以按需创建出用户实现的对象

(4)提供了大量的系统参数供用户按需设置,增强系统的场景定制性

 

业界内存在大量的基于Netty框架开发的协议,例如基于NettyHTTP协议、Dubbo协议、RocketMQ内部私有协议。

posted @ 2019-07-16 22:16  深蓝---Jack  阅读(486)  评论(0编辑  收藏  举报