对于小文件来说,断点续传并不是必备的需求,只不过之前业务中已经包含此功能,因此对于升级文件读取方案后,也需要支持该功能,这样可以实现客户端及服务端得无缝升级。
对于容器断点续传功能,此前已经实现,这里只描述Nginx断点续传。Nginx的断点续传功能主要由ngx_http_range_filter_module
模块实现,该模块主要有ngx_http_range_header_filter_module
、ngx_http_range_body_filter_module
等两个模块组成。其中ngx_http_range_header_filter_module
模块主要用于设置Http响应头,设置响应头中的Content-Range
(指定响应的文件区间块的开始和结束位置),Content-Length
(指定断点续传时应答的包大小),同时设置响应状态码为206
,参见下述测试。ngx_http_range_body_filter_module
模块主要用于根据区间的位置,从缓冲区中读取数据并发送给客户端。
以上描述了Nginx实现断点续传的主要组件,当客户端以断点续传方式进行文件下载时,需要设置Range头信息,如上图中的
Range: bytes=12-212
,要从服务器取文件的12开始到212之间的字节数据,当该请求经过容器鉴权后,转发到Nginx,会被ngx_http_range_header_filter_module
模块拦截处理,读取Range参数,并进行解析,确定是区块下载时,会进行设置相应头处理流程,设置完成后,该请求会被ngx_http_range_body_filter_module
模块拦截并处理,该模块同样会处理Range头信息,此处的处理会按照单个区块请求和多区块请求分别进行处理,按照Range指定的区块,从缓冲区进行读取数据并发送给客户端。以下为Range的参数格式,以及多区块传递描述。
Range : bytes=12-212,322-422
Range的值支持形式如下:
Range: bytes=x-y 表示第 x-y 字节范围的内容x取值为[0-contentlength],y取值为[x,contentlength]
Range: bytes=-y 表示最后 y 字节的内容
Range: bytes=x- 表示从第 x 字节开始到文件结束部分的内容
Range: bytes=x-y,x1-y1 同时指定几个范围
整体上文件存储改为FastDFS存储,同时不在使用容器API提供数据下载后,切换到Nginx下载,并实现原有的限流、鉴权等功能,对于客户端来说,没有任何的变更,服务端升级后,客户端可以直接应用。
网友评论