亲啊嘴金,发布于:2023-04-11 02:49:59 | 0 浏览
2023年对Http服务器的range特性的后端上行链路聚合研究
HTTP的Range, Content-Range,简单来讲就是把服务器响应的资源切割成小块,然后客户端那边拼凑整块。
因为这个特性,所以可以实现为 断点续传、多线程下载,视频任意拖动,巨大压缩包按需加载解压,以及服务端的按需缓存。等各种功能。
我的场景如下。后端有服务器,2种物理网络端点(电信、和联通),连接到公网IP机。
那么 用户公网访问资源时候,是公网机 -> 后端,这是很典型的反向代理的基础应用。响应包 网速由 后端到公网的 上行决定。
比如 用户和公网之间可以跑满速;但是后端一条线只有 1mb/s 的上行,用户请求 /big.bin 的时候 用户那边就只能真实 1mb/s 速度下载
这个时候就需要公网中间机把用户的请求弄成多份发到多条线的后端,让后端多条线都响应上行。
因为 Http 的特性以及各种 proxy 的负载均衡设定 都没有什么能够同时让多后端不同网线链路都响应同一请求的上行的。
解决方法高端点的可以弄个虚拟网卡镜像,这样公网机 Webserver 应用层发出的网络请求都镜像成多份发给后端,既然镜像了,自然可以利用多条线的响应合并。(这当然不是本篇研究的范畴)
变通方法我也知道,可以用javascript new blob 接着去 fetch 携带不同的请求头或者参数去让用户端多包发送请求,用户端合包啥啥的。(这是变通方法,而不是解决问题方法)
还有一种曲折实现。就是用 Nginx slice 去切,切来的文件给cache了,用户请求的时候,就是 cache 和 后端 同时发出。这个解决方案可以说很完美了。
但是这个解决方案涉及到一个 cache 淘汰机制,而且必须得 cache 不 cache 去 slice 意义不大。
([参考1]( #!//jayce.github.io/public/posts/nginx/the-problem-with-using-slice/ "cache机制"))
([参考2]( #!//www.4os.org/2023/04/06/nginx-range%E5%9B%9E%E6%BA%90-%E5%92%8C-range-slice%E5%9B%9E%E6%BA%90/))
因为我变通的方法,问题的关键在哪我都理解,以及比较偏系统层级的解决方法我都知道。所以当时我觉得这不是一个复杂实现,
我甚至都觉得 Nginx 以及其它派生版本可以搞定这一需求。Nginx 不行就 haproxy ,haproxy 不行就 squid ,squid 不行就我愿意付费的 Caddy 总有一个得行。
收费的 NGINX Plus 是可以的。。(#!https://segmentfault.com/a/1190000042051046)
于是乎我就翻 他们这些的 手册,看看有没有控制能把一条请求分拆响应的 类似于多线合并 的功能,找到了 Nginx mirror ,看来看去介个 mirror 也只是测试用的,多条请求发给后端,响应还是得选其中一个。
我的目的是要真实的多线都上行响应给用户啊。h、n、s、c 这些服务器手册上描述的最适合的应用场景好像都不太符合我的需求。
后来又看 因为 Http Range 特性没调整设置好,也会折损性能,但是大多实现目的都不是合并响应上行带宽。还看了关于range的拒绝攻击漏洞和分析。
而且这里又引出了第二个问题,就是总有那么一些客户端,他极有可能发恶意的 range 范围包。0-1这样的范围,发1万包,这在配置上可以规避的。但是这在http协议上来讲是符合协议的。因为服务器要按照range的规则响应。。
接着想了想,这个确实得自己写个软件给实现了,原理大致就是,Nginx配置不变,nginx那边 if range一下 发给我的程序,
我的程序去HEAD请求后端多台,在程序里面添加头实现按照比例 range 范围0-1024请求到第一台,范围请求1025-2048到第二台。。而且因为有上述第二个问题的存在,所以range的拆分规则得写自己程序规避。
我还想实验下 Php 能不能直接给撸了,Php curl 新版本原生就支持多线程了,关键在于Php的拉取的流拼包处理能力比其它语言要弱一些。
用Go写也行,同样,Go面临一个Socket处理上相对也比较弱。
还有就是,在我目前的这个场景中根本不需要太过于去考虑性能方面的事情,虽然这个场景还真就是极度考验性能的地方。
又得跑题说一句,现在很多文案,动不动就是单台小配置机承担上千万并发,我真不理解除了炫技之外有啥用。1台承受一千万并发,和10台共同支撑千万并发,本质上都是一样的,主打的就是一个B端无感知。
1台要扩容的情况,10台也得扩容。至今没有看过有人愿意把已经有的10台给优化1台的。即便有,那也是业务发生变化了。