当前位置: 首页 > 后端技术 > Java

面试官:为什么要合并HTTP请求?

时间:2023-04-01 23:59:46 Java

来源:https://www.jianshu.com/p/9a3...思考路径:为什么要实现批量调用?->减少网络中的传输损失->如何减少?->通过合并HTTP请求->合并HTTP请求如何减少网络丢失?本文将解决这个问题。让我们看一下携带大量信息的单个请求与携带少量信息的多个请求的总体时间影响。1.客户端发送请求1.1HTTP1.1可以保持长连接,但是在每次不同的请求之间,客户端都要向服务器发送一个请求头。请求不能并行执行。在一个连接中,如果不合并,需要建立N个连接,那么合并可以节省(N-1)*RTT的时间,RTT是指网络延迟(在传输介质中传输所花费的时间,即消息开始进入网络到开始离开网络的时间)。1.2TCP丢包问题是慢启动,拥塞控制窗口TCP包乱序到达。合并后的文件可以让组长弥补组内丢失的数据包。但是,当资源分离时,前面的资源还没有加载,后面的资源也没有完成。无法加载,会出现比较严重的队头阻塞问题,丢包率会严重影响Keepalive情况下多个文件的传输速率。1.3浏览器线程数限制为最多2-6个线程,每个连接上会串行发送多个请求。太多的TCP连接会给服务器带来很大的压力。1.4DNS缓存问题每个请求都需要查找DNS缓存,多个请求需要多次查找,缓存可能无缘无故清空2.服务端需要为每个请求使用一个连接,建立线程,分配CPU的一部分。对于CPU来说,是一种负担,尤其是一般建立连接后,即使请求发回,在超时之前连接还会保持一段时间。这时候保持连接是对服务器资源的巨大浪费。3、以上对HTTP2.0的描述都是基于HTTP/1.1的一些特性,或者缺点,比如长连接但无法并行处理请求,TCP的慢启动和拥塞控制,以及队头阻塞问题都给整体性能带来了很大的劣势,所以我们对HTTP2.0进行了有针对性的改进。很有意思的事情,看图就知道:太爽了,HTTP/2多了很多特性,解决了HTTP/1.1的很多问题3.1全复用解决了队头阻塞的问题。对于同一个TCP连接,现在可以发送多个请求并接收多个响应!在HTTP/1.1中,如果一个连接中前一个请求发生丢包,那么之后的所有请求都必须等待第一个请求补好包,收到响应后才能继续执行。在HTTP/2中,可以直接并行处理。3.2HeaderCompression所有的HTTP请求和响应都有header,但是header很可能包含缓存信息,导致它们的大小迅速增加。但是在一次连接中,大部分请求的请求头其实都携带了相似的信息,所以HTTP/2使用了一个索引表来存储第一个请求的请求头,之后后续的类似请求只需要携带这个索引号就可以了.标头压缩将标头大小平均减少30%,从而加快整体网络传输速度。这两点与本文最相关。有了这两点,HTTP/2协议下合并HTTP请求的好处就基本消失了。合并或不合并请求更多取决于业务需求和一些后端配置。4.总结这是一个权衡。其实最重要的是看你传输的是什么,因为合并HTTP请求本质上是减少了网络延迟,但是如果你在服务器上的处理时间远大于网络延迟时间,那么合并HTTP请求给你的意义不大性能增益。而且大量数据的传输肯定会降低浏览器的缓存命中率,缓存的利用率也会大大降低。但是对于HTTP请求携带的数据量比较少的情况,合并请求带来的性能提升会很明显。参考https://www.zhihu.com/questio...https://www.zhihu.com/questio...https://deliciousbrains.com/p...https://www.tutorialdocs.com/...近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.别满屏if/else,试试策略模式,真香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!