Netty实现高性能、高可靠、可定制和可扩展分析

Netty如何实现高性能?

性能是设计出来的,不是测试出来的。Netty采用如下设计实现高性能:

  • 采用异步非阻塞的I/O类库,基于Reactor模式实现,解决了传统同步阻塞I/O模式下一个服务端无法平滑处理线性增长的客户端的问题
  • TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复制,提升了I/O读取和写入的性能
  • 支持通过内存池的方式循环利用ByteBuf,避免了频繁创建和销毁ByteBuf带来的性能损耗。
  • 可配置的I/O线程数、TCP参数等,为不同的用户场景提供定制化的调优参数,满足不同的性能场景
  • 采用环形数组缓冲区实现无锁化并发编程,代替传统的线程安全容器或者锁
  • 合理使用线程安全容器、原子类等,提升系统的并发处理能力
  • 关键资源的处理使用单线程串行化的方式,避免多线程并发访问带来的锁竞争和额外的CPU资源消耗问题
  • 通过引用计数器及时的申请释放不再被引用的对象,细粒度的内存管理降低了GC的频率,减少了频繁GC带来的时延增大和CPU损耗

可靠性

作为一个高性能的异步通信框架,架构的可靠性是大家选择的一个重要依据。下面我们探讨Netty架构的可靠性设计:

  1. 由于长连接不需要每次发送消息都创建链路,也不需要在消息交互完成时关闭链路,因此相对于短连接性能更高。对于长连接,一旦链路建立成功便一直维系双方之间的链路,知道系统推出。 为保证长连接的链路有效性,往往需要通过心跳机制周期性的进行链路检测。使用周期性心跳的原因是:在系统空闲时,例如凌晨,往往没有业务消息。如果此时链路被防火墙hang住,或者遭遇网络闪断、网络单通等,通信双方无法识别出这类链路异常。等到第二天业务高峰期到来时,瞬间的海量业务冲击会导致消息积压无法发送给对方,由于链路的重建需要时间,这期间业务大量失败(集群或者分布式组网情况会好一些)。为了解决这个问题,需要周期性的心跳对链路进行有效性检测,一旦发生问题,可以及时关闭链路,重建TCP连接。 当有业务消息时,无需心跳检测,可以由业务消息进行链路可用性检测。所以心跳消息往往是在链路空闲时发送的。 为了支持心跳,Netty提供了如下两种链路空闲检测机制。
    • 读空闲超时机制:当连续周期T没有消息可读时,触发超时Handler,用户可以基于读空闲超时发送心跳消息,进行链路检测;如果连续N个周期任然没有读取到心跳信息,可以主动关闭连接。
    • 写空闲超时机制:当连续周期T没有消息要发送时,出发超时Handler,用户可以基于写空闲超时发送心跳消息,进行链路检测;如果联系N个周期仍然没有接收到对方的心跳消息,可以主动关闭链路。 为了满足不同用户场景的心跳定制,Netty提供了空闲状态检测事件通知机制,用户可以订阅空闲超时事件、写空闲超时事件、读或者写超时事件,在接收到对应的空闲事件之后,灵活的进行定制。
  2. 内存保护机制 Netty提供多种机制对内存进行保护,包括以下几个方面:
  • 通过对象引用计数器对Netty的ByteBuf等内置对象进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护。
  • 通过内存池来重用ByteBuf,节省内存
  • 可设置的内存容量上限,包括ByteBuf、线程池线程数等
  1. 优雅停机 相比于Netty的早期版本,Netty5.0版本的优雅退出功能做的更加完善。优雅停机功能指的是当系统退出时,JVM通过注册的ShutDown Hook拦截到退出信号量,然后执行退出操作,释放相关模块的资源占用,将缓冲区的消息处理完成或者清空,将待刷新的数据持久化到磁盘或者数据库中,等到资源回收和缓冲区消息处理完成后,再退出。

可定制性

Netty的可定制性主要体现在以下几点:

  • 责任链模式:ChannelPipeline基于责任链模式开发,便于业务逻辑的拦截、定制和扩展。
  • 基于接口的开发:关键的类库都提供了接口或者抽象类,如果Netty自身的实现无法满足用户的需求,可以由用户自定义实现相关接口
  • 提供了大量工厂类,通过重载这些工厂类可以按需创建出用户实现的对象
  • 提供了大量的系统参数供用户按需设置,增强系统的场景定制性

可扩展性

基于Netty的基础NIO框架,可以方便地进行应用层协议定制,例如HTTP协议栈、Thrift协议栈、FTP协议栈等。这些扩展不需要修改Netty的源码,直接基于Netty的二进制类库即可实现协议的扩展和定制。 目前,业界存在大量的基于Netty框架开发的协议,例如基于Netty的HTTP协议、Dubbo协议、RocketMQ内部私有协议等。

参考文献:《Netty权威指南》

转载于:https://my.oschina.net/u/3729778/blog/2003703

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值