javascript - Ajax 请求有多少开销
问题描述
我正在开发一个需要处理来自服务器的大量数据的网络应用程序。
数据可以“流式传输”并分块处理,因此为了加快速度,我将数据分成数据包并使用 ajax 下载每个数据包。
我使用 javascript 承诺在前一个接收到数据时发送下一个 ajax 请求。
每个数据包大约 300KB,通常总共有 20 个。
现在我的问题是,当我没有分解数据包时(即我下载一个 6MB 的文件),我的浏览器/网络需要大约 4 秒才能完成。
但是,当我将其分解为数据包时,即使文件大小最终相同,浏览器也需要大约 8 秒才能下载所有数据包。
我预计每个发送新的 http 标头等的请求都会产生一些开销......但是速度要慢两倍是相当令人震惊的。
我尝试将 ajax 请求移动到一个网络工作者身上,认为主线程可能会延迟它们,但同样的事情也会发生。
有没有办法加快这个过程,或者是否有任何 javascript 协议可以保持连接打开。
我知道浏览器可以通过视频流来做到这一点,但我不知道如何将该协议与二进制数据包一起使用。
解决方案
我相信默认情况下浏览器中的 TCP 连接也受 TCP 拥塞控制。
例如,“慢启动”会提高读取/发送数据的速率,以免使服务器不堪重负并获得服务器可以处理的流量负载的基线。
如果您将 6MB 请求分解为多个请求,则您可能会为每个请求支付“慢启动”罚款。
更多信息在这里: https ://en.wikipedia.org/wiki/TCP_congestion_control
您可以尝试在服务器上打开 keep-alive 标头,看看这是否会改善情况。
推荐阅读
- eclipse - 将 Eclipse 从 Mars 更新到 2020-09 并使用相同的工作区后,没有本地历史记录
- python - 从包含逗号分隔值的列的python数据框中选择字符串python
- python - 当我将浮点数放入 numpy 数组时出现问题
- apache-kafka - Akka Stream 是否像 Kafka Streams 那样实现连接语义?
- multithreading - Java 8 Stamped Lock:为什么这段代码不会导致死锁?
- node.js - (蓝牙低功耗)当外围设备发送“指示”时订阅特性。使用 Noble
- firebase - Flutter with Firebase Firestore 不显示正确的图标(像按钮系统)
- python - 如何将计算机键盘上的键盘键链接到 Tkinter 按钮?
- security - 我主页上的流量被重定向到另一个站点
- python - 在多标签分类问题的情况下如何计算 f1_score