Netty:可靠性

Netty应用场景:

1.RPC框架的基础网络通信框架:主要用于分布式节点之间的通信和数据交换,在各个业务领域均有典型的应用,例如阿里的分布式框架Dubbo,消息队列Rocket MQ,大数据处理Hadoop的基础通信和序列化框架Avro。

2.私有协议的基础通信框架:Thrift协议,Dubbo协议等;

3.公有协议的基础通信框架:HTTP协议,SMPP协议。

链路的有效性检测

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

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

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

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

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

心跳检测分为两类:

1.ping-pong型心跳:由通信一方定时发送Ping消息,对方接收到Ping消息之后,立即返回Pong应答消息给对方,属于请求-响应型心跳。

2.ping-ping型心跳:不区分心跳请求和应答,由通信双方按照时间约定,定时向对方发送心跳ping消息,它属于双向心跳。

Netty提供的空闲检测机制分为三种:

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

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

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

Netty的默认读写空闲机制是发生超时异常,关闭连接,但是我们可以定制它的超时实现机制,以便支持不同的用户场景。

Reactor线程的保护

尽管Reactor线程主要处理I/O操作,发生的异常通常都是IO异常,但是,实际上在一些特殊场景下会发生非IO异常,如果仅仅捕获IO异常可能就会导致Reactor线程跑飞。为防止发生这种意外,在循环体内一定要捕获Throwable,而不是IO异常或者Exception。

Netty:可靠性

内存保护

1.链路总数的控制:每条链路都包含接收和发送缓冲区,链路个数太多容易导致内存溢出;

2.单个缓冲区的上限控制:防止非法长度或者消息过大导致内存溢出;

3.缓冲区内存释放:防止因为缓冲区使用不当导致的内存泄露;

4.NIO消息发送队列的长度上限控制。

为了提升内存的利用率,Netty提供了内存池和对象池。

流量整形

流量整形是一种主动调整流量输出速率的措施。

作为高性能的NIO框架,Netty的流量整形有两个作用:

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

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

全局流量整形

链路级流量整形

优雅停机接口

 

备注:文章参考《Netty权威指南》,作者:李林锋。