non-blocking网络框架流量控制

一般的non-blocking网络框架都会有两块应用层缓冲区Buffer:输入和输出。

防止卡在write和read处,损失性能,异步处理。

  1. write:没必要非写完缓冲区的所有数据(需要等待TCP缓冲区可写),可以多发送几次;
  2. read:没必要每次都要读到一个完整的数据包分割处,或者读到撑爆缓冲区;

由于缓冲区的存在,势必需要控制缓冲区大小,便有了高水位回调和低水位回调这种流量控制方案。

高水位回调:网络速率大于数据接收处理速率

常见场景:代理服务

在一台PC上,多个应用向本地proxy server请求,假设LOOPBACK速度是100M/s,但是proxy server向外部网络请求的速度是10M/s(路由器硬件、运营商带宽),这个应该是比较常见的。

此时如果proxy server不停读取数据,然后异步发送,肯定会造成内存数据堆积,撑爆内存;

  1. 限定读取缓冲区大小到一个值(MAX_SIZE),然后停止读取网络IO上的数据(交给下层TCP协议处理),处理数据转发;
  2. 等缓冲区低于MAX_SIZE,proxy server继续读取网络IO上的数据,再继续处理数据转发。

低水位回调:分包发送

常见场景:大文件下载

一般大文件下载功能的实现,不会把整个文件读到内存发送到网络,因为这样一定会造成内存数据堆积,撑爆内存;

所以下载实现的一般步骤如下:

  1. 读取文件的一定长度,然后发送;
  2. 等发送完成后,再读取一部分,继续发送;
  3. 直至文件读取完成,下载便完成了。

以上步骤不要用while循环,用异步(callback)或者协程(coroutine)实现。