读懂Netty的高性能架构之道

  链路有效性检测

  Netty提供的心跳检测机制分为三种:

  1.读空闲,链路持续时间t没有读取到任何消息;

  2.写空闲,链路持续时间t没有发送任何消息;

  3.读写空闲,链路持续时间t没有接收或者发送任何消息。

物联网

  当网络发生单通、连接被防火墙Hang住、长时间GC或者通信线程发生非预期异常时,会导致链路不可用且不易被及时发现。特别是异常发生在凌晨业务低谷期间,当早晨业务高峰期到来时,由于链路不可用会导致瞬间的大批量业务失败或者超时,这将对系统的可靠性产生重大的威胁。

  从技术层面看,要解决链路的可靠性问题,必须周期性的对链路进行有效性检测。目前最流行和通用的做法就是心跳检测。

  心跳检测机制分为三个层面:

  1.TCP层面的心跳检测,即TCP的Keep-Alive机制,它的作用域是整个TCP协议栈;

  2.协议层的心跳检测,主要存在于长连接协议中。例如SMPP协议;

  3.应用层的心跳检测,它主要由各业务产品通过约定方式定时给对方发送心跳消息实现。

  心跳检测的目的就是确认当前链路可用,对方活着并且能够正常接收和发送消息。做为高可靠的NIO框架,Netty也提供了基于链路空闲的心跳检测机制:

  1.读空闲,链路持续时间t没有读取到任何消息;

  2.写空闲,链路持续时间t没有发送任何消息;

  3.读写空闲,链路持续时间t没有接收或者发送任何消息。

  流量整形

  流量整形(Traffic Shaping)是一种主动调整流量输出速率的措施。Netty的流量整形有两个作用:

  1.防止由于上下游网元性能不均衡导致下游网元被压垮,业务流程中断;

  2.防止由于通信模块接收消息过快,后端业务线程处理不及时导致的“撑死”问题。

  流量整形的原理示意图如下:

物联网

  流量整形(Traffic Shaping)是一种主动调整流量输出速率的措施。一个典型应用是基于下游网络结点的TP指标来控制本地流量的输出。流量整形与流量监管的主要区别在于,流量整形对流量监管中需要丢弃的报文进行缓存——通常是将它们放入缓冲区或队列内,也称流量整形(Traffic Shaping,简称TS)。当令牌桶有足够的令牌时,再均匀的向外发送这些被缓存的报文。流量整形与流量监管的另一区别是,整形可能会增加延迟,而监管几乎不引入额外的延迟。

  Netty支持两种流量整形模式:

  1.全局流量整形:全局流量整形的作用范围是进程级的,无论你创建了多少个Channel,它的作用域针对所有的Channel。用户可以通过参数设置:报文的接收速率、报文的发送速率、整形周期。

  2.链路级流量整形:单链路流量整形与全局流量整形的最大区别就是它以单个链路为作用域,可以对不同的链路设置不同的整形策略。

  优雅停机

  Netty的优雅停机三部曲:

  1.不再接收新消息

  2.退出前的预处理操作

  3.资源的释放操作

物联网

  Java的优雅停机通常通过注册JDK的ShutdownHook来实现,当系统接收到退出指令后,首先标记系统处于退出状态,不再接收新的消息,然后将积压的消息处理完,最后调用资源回收接口将资源销毁,最后各线程退出执行。

  通常优雅退出需要有超时控制机制,例如30S,如果到达超时时间仍然没有完成退出前的资源回收等操作,则由停机脚本直接调用kill -9 pid,强制退出。

  在实际项目中,Netty作为高性能的异步NIO通信框架,往往用作基础通信框架负责各种协议的接入、解析和调度等,例如在RPC和分布式服务框架中,往往会使用Netty作为内部私有协议的基础通信框架。 当应用进程优雅退出时,作为通信框架的Netty也需要优雅退出,主要原因如下:

  尽快的释放NIO线程、句柄等资源;

  如果使用flush做批量消息发送,需要将积攒在发送队列中的待发送消息发送完成;