大屏加载速度优化--突破chrome 6个请求线程限制

news2024/11/16 12:05:40

1. 问题

当大屏中的内容很多时,比如50个以上,整个页面呈现速度会慢很多,影响用户体验。
通过 chrome开发者工具可以看到,默认情况下,chrome仅开启6个请求线程,用于发起ajax请求。

2. 解决方案

改进的方式有:
(1)调整加载次序。让页面前面的内容先加载,后面的内容后加载。
(2)页面的框架先加载,组件内容再加载。如果页面的框架可以在1S内加载完毕,用户体验会好很多。
(3)突破chrome 6个线程的限制。

下面重点讲解如何突破chrome6个线程的限制。

3. 步骤

3.1. 原理

chrome对同一个域的并发请求数量限制为6。只要让请求处于不同域,就可以打破这个限制。
域由三个部分构成: 协议+主机名+端口,只要一个不同,域就不同。在下面的示例中,我们使用多个不同的端口。

3.2. 后端

文件:TestController .java。它定义了一个接口,这个接口的执行时间为1秒。

在这里插入图片描述

文件:TomcatConfig .java。它定义3个httpConnector,分别对应8080, 8081, 8082端口。


```java
import org.apache.catalina.connector.Connector;
import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.ProtocolHandler;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class TomcatConfig {

    /**
     * @return
     */
    @Bean
    public ServletWebServerFactory httpServerFactory() {
        // http connector
        Connector connector1 = createHttpConnector(8080);
        Connector connector2 = createHttpConnector(8081);
        Connector connector3 = createHttpConnector(8082);
        // 注册额外的connector
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(connector1, connector2, connector3);
        return tomcat;
    }


    /**
     * 创建 http connector
     *
     * @return
     */
    private Connector createHttpConnector(int port) {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(port);
        // 设置最大线程数
        ProtocolHandler handler = connector.getProtocolHandler();
        if (handler instanceof AbstractProtocol) {
            AbstractProtocol protocol = (AbstractProtocol) handler;
            // 运行controller代码的线程的最大数量
            protocol.setMaxThreads(200);
        }
        return connector;
    }
}

3.3. 前端

文件 index.html。使用axios模拟60个并发请求。函数axiosSwitchHost会随机地切换host。代码仅用于演示,生产中请自行封装。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script>

    var urls = ['http://127.0.0.1:8080',
        'http://127.0.0.1:8081',
        'http://127.0.0.1:8082'
    ];

    /**
     *  切换 host
     */
    function axiosSwitchHost() {
        var index = Math.floor((Math.random() * urls.length));
        console.log(index)
        axios.defaults.baseURL = urls[index];
    }

    // 要ctrl + f5强制刷新
    // 可以看到,chrome总共开了大约3*6个线程来发起ajax请求
    for (let i = 0; i < 60; i++) {
        axiosSwitchHost()
        axios.get("/test1").then(function (result) {
            console.log(result.data)
        });
    }
</script>
</html>

3.4. 效果在这里插入图片描述

如上图所示,可以看到,并发的线程数多了很多,大约为16个。增加httpConnector的数量,可以进一步提升并发的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

epoll模型要点总结

(图是网上的&#xff0c;懒得自己画了) 1 epoll_ctl是向红黑树rbr插入、删除、修改fd。epoll_wait在双向链表rdllist中查询IO可读、可写、错误事件。 为什么使用红黑树&#xff1f;从插入、删除考虑。 2 epoll_ctl插入新fd时&#xff0c;新建epitem&#xff0c;会设置回调函…

2023年第五届清洁能源与智能电网国际会议(CCESG 2023)

2023年第五届清洁能源与智能电网国际会议&#xff08;CCESG 2023&#xff09; 重要信息 会议网址&#xff1a;www.ccesg.org 会议时间&#xff1a;2023年4月21-23日 召开地点&#xff1a;广西-南宁 截稿时间&#xff1a;2023年2月28日 录用通知&#xff1a;投稿后2周内 收…

结合代谢组学和网络药理学研究康复消炎栓治疗慢性盆腔炎作用机制

文章标题&#xff1a;Integrated Metabolomics and Network Pharmacology Study on the Mechanism of Kangfuxiaoyan Suppository for Treating Chronic Pelvic Inflflammatory Disease 发表期刊&#xff1a;Frontiers in Pharmacology 影响因子&#xff1a;5.988 发表年份&…

读书:《好奇心:保持对未知世界永不停息的热情》

刚看到《好奇心》这本书的书名&#xff0c;我对《好奇心》还是有点好奇心的。 为什么小孩的好奇心比大人多&#xff1f;也不一定&#xff0c;如果家长或老师没有足够好的引导的话&#xff0c;孩子也会对周围的世界没有兴趣。 好奇心为两种&#xff1a;消遣性好奇、认识性好奇…

【go-zero】在微服务架构中是否要使用分布式事务 如何避免分布式的耦合 微服务与分布式事务的对立

微服务要不要引入分布式事务讨论问题&#xff1a;微服务要不要引入分布式事务&#xff1f;1、分布式事务的场景分析2、分析利与弊3、如何优化分布式事务3.1 什么是CAP理论3.2 方式一&#xff1a;避免使用分布式事务1&#xff09;同步阻塞2&#xff09;异步调用3&#xff09;粗粒…

Linux中的Nginx平滑升级与回退

目录 一、平滑升级概述 1.平滑升级的定义 2.平滑升级的思路 &#xff08;1&#xff09;关于版本和备份 &#xff08;2&#xff09;向旧的Nginx的master进程发送USR2信号 &#xff08;3&#xff09;向旧的master进程发送winch信号&#xff0c;旧的worker子进程退出 &…

【疑难杂症】allennlp安装报错:Installing build dependencies ... error

背景&#xff1a; 配置PURE的算法环境&#xff0c;安装allennlp 0.9.0 &#xff08;pip install allennlp0.9.0&#xff09;报错&#xff0c;如图所示&#xff1a; 探索&#xff1a; 发现allennlp的依赖中有spacy&#xff0c;是在安装spacy 2.1.9的依赖时报错了。 此时我尝试…

PCB如何添加SMT定位孔经验总结

&#x1f3e1;《总目录》 目录1&#xff0c; 什么是SMT定位孔2&#xff0c;SMT定位孔有什么特征3&#xff0c;添加SMT定位孔的经验原则4&#xff0c;其他注意事项1&#xff0c; 什么是SMT定位孔 SMT定位孔是指在PCBA的SMT贴片焊接阶段&#xff0c;为了准确固定和定位板卡的机械…

【OpenGL学习】颜色和光照

颜色和光照 一、颜色的物理解释 颜色&#xff08;英语&#xff1a;colour&#xff0c;color&#xff09;又称色彩、色泽&#xff0c;是眼、脑和我们的生活经验对光的颜色类别描述的视觉感知特。这种对颜色的感知来自可见光谱中的电磁辐射对人眼视锥细胞的刺激。颜色是由光反射…

boost搜索引擎

文章目录1.项目介绍2.搜索引擎技术栈和项目环境3.正排索引和倒排索引 - 搜索引擎具体原理4.编写数据去标签和数据清洗模块Parser5.编写建立索引模块Index6.编写搜索引擎模块Searcher7.编写http_server8.效果展示1.项目介绍 Boost官网没有对应的搜索引擎&#xff0c;不方便我们…

04 frameset-iframe【尚硅谷JavaWeb教程】

04 frameset-iframe【尚硅谷JavaWeb教程】 frameset、iframe这个标签基本上已经不用了。 frameset标签 一个大的网页由很多个小的网页组成&#xff0c;会用到frameset。 frameset 表示页面框架&#xff0c;这个标签已经淘汰&#xff0c;了解&#xff0c;不需要掌握。 frame表…

Element ui Avatar头像管理组件 实现当用户没有头像时 以名称最后一个字为头像

el-avatar是一个比较方便的头像管理组件 src控制他的图片展示 <el-avatarclass "avatar":src"item.images" ></el-avatar>样式的话 可以用avatar控制 <style> .avatar{width: 18px;height: 18px;line-height: 18px; } .avatar img{b…

【可解释性机器学习】TextExplainer: 调试黑盒文本分类器

TextExplainer: 调试黑盒文本分类器示例问题&#xff1a;20个新闻组数据集的LSA SVM模型TextExplainer文本解释器的工作原理我们应该相信这个解释吗&#xff1f;让它们犯错吧让它们再次犯错吧自定义TextExplainer: 采样过程自定义TextExplainer&#xff1a;分类器参考资料尽管…

记录每日LeetCode 237.删除链表中的节点 Java实现

题目描述&#xff1a; 有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。 删除给定的节点。注…

Kotlin之使用DSL构建专有的语法结构

DSL的全称是领域特定语言(Domain Specific Language)&#xff0c;它是编程语言赋予开发者的一种特殊能力&#xff0c;通过它我们可以编写出一些看似脱离其原始语法结构的代码&#xff0c;从而构建出一种专有的特殊结构。 Kotlin也是支持DSL的&#xff0c;并且在Kotlin中实现DSL…

CF——1766C - Hamiltonian Wall

题目链接 1766C - Hamiltonian Wall Rating&#xff1a;1300 题目描述 Sir Monocarp Hamilton is planning to paint his wall. The wall can be represented as a grid, consisting of 2 rows and m columns. Initially, the wall is completely white. Monocarp wants to p…

Leetcode力扣秋招刷题路-0101

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1…

[LeetCode周赛复盘] 第 330 场周赛20230129

[LeetCode周赛复盘] 第 330 场周赛20230129 一、本周周赛总结二、 [Easy] 6337. 统计桌面上的不同数字1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6338. 猴子碰撞的方法数1. 题目描述2. 思路分析3. 代码实现四、[Hard] 6339. 将珠子放入背包中1. 题目描述2. 思路分析3. 代…

过年了,给网站加个灯笼+飘雪效果!

过年了&#xff0c;下面分享一个网站的特效&#xff0c;给网站添加一个新春灯笼和飘雪的效果&#xff0c;过年期间多一点年味。灯笼特效下面是css样式&#xff0c;可以放在公共样式中&#xff1a;.deng-box{position:fixed;top:-40px;right:150px;z-index:9999;pointer-events:…

【音视频工具】前端屏幕录制工具 + 录制<video>标签内容

一、录制的实现思路 1.开始录制、停止录制、下载视频 2.Blob介绍 3.概念 var mediaRecord //用于录制视频 var mediaStream //视频流 var videoBuffer [] //保存的视频数据二、屏幕录制工具 下载地址&#xff1a; https://chrome.google.com/webstore/detail/tampermonkey…