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。
内存保护
1.链路总数的控制:每条链路都包含接收和发送缓冲区,链路个数太多容易导致内存溢出;
2.单个缓冲区的上限控制:防止非法长度或者消息过大导致内存溢出;
3.缓冲区内存释放:防止因为缓冲区使用不当导致的内存泄露;
4.NIO消息发送队列的长度上限控制。
为了提升内存的利用率,Netty提供了内存池和对象池。
流量整形
流量整形是一种主动调整流量输出速率的措施。
作为高性能的NIO框架,Netty的流量整形有两个作用:
1.防止由于上下游网元性能不均衡导致下游网元被压垮,业务流程中断;
2.防止由于通信模块接收消息过快,后端业务线程处理不及时导致的“撑死”问题。
全局流量整形
链路级流量整形
优雅停机接口
备注:文章参考《Netty权威指南》,作者:李林锋。