自适应流控方案
入口流控自适应方案
问题:在Netty中引入业务线程池带来的问题就是速率不匹配,如果IO线程接受数据的速度超过业务线程的处理速度,就会出现缓冲队列溢出,此时需要能够对客户端的发送速率进行控制。
如下图所示,提供了一种基于TCP Flow-Control机制的自适应流控方案。当缓冲区溢出时,服务端会按一定的规则选取出最消耗业务线程资源的客户端,然后将客户端对应连接的auoread属性设置为false,过段时间再重新恢复,设为true。背后的原理就是利用了TCP的 Flow-Control机制,当auoread设为false时,Selector不再监听连接的读事件,这样很快TCP的接受缓冲区就会被填满,进而客户端接受到的ACK中的窗口大小会逐渐变小,直至变成0,从而达到客户端降低发送数据速率的目的。
注意:连接的autoread不能长时间关闭。如果autoread被长期设为false,对端发送FIN的时候,接收端应用层是感知不到的。此时内核将这个socket的状态变成CLOSE_WAIT,但是因为应用层感知不到,所以应用层一直没有调用close,此时这个连接就会长期处于CLOSE_WAIT状态。