浏览器CDN资源并行加载与域名策略指南
1. 浏览器并行加载机制
1.1 基础并行策略
sequenceDiagram participant Browser as 浏览器 participant DNS as DNS服务器 participant CDN1 as 域名 1 participant CDN2 as 域名 2 Browser->>DNS: 解析域名 1 Browser->>DNS: 并行解析域名 2 DNS-->>Browser: 返回CDN1 IP DNS-->>Browser: 返回CDN2 IP par 并行请求 Browser->>CDN1: 请求资源1 Browser->>CDN2: 请求资源2 Note over Browser,CDN2: 基于优先级和连接数限制
动态调度请求 end CDN1-->>Browser: 返回资源1 CDN2-->>Browser: 返回资源2
NOTE
浏览器并行加载资源主要受以下因素影响:
- 并发连接数限制:
- 同一域名下的并发连接数限制(通常为6-8个)
- 总并发连接数限制(因浏览器而异)
IMPORTANT
浏览器对不同类型资源有不同的加载优先级策略
- 资源优先级:
- CSS(最高优先级)
- JavaScript(高优先级)
- 图片(中等优先级)
- 字体(低优先级)
javascript
// 资源优先级管理器
class ResourcePriorityManager {
constructor() {
this.priorities = {
HIGHEST: ['css'], // 样式表
HIGH: ['js'], // 脚本
MEDIUM: ['image'], // 图片
LOW: ['font'], // 字体
LOWEST: ['prefetch'] // 预加载资源
};
}
calculatePriority(resource) {
const extension = resource.split('.').pop();
for (const [priority, types] of Object.entries(this.priorities)) {
if (types.includes(extension)) {
return priority;
}
}
return 'MEDIUM';
}
}
1.3 影响因素
DNS解析:
- 每个新域名都需要DNS解析
- DNS预解析可以优化这个过程
<link rel="dns-prefetch">
TCP连接:
- 需要TCP三次握手
- 可以使用Keep-Alive保持连接
- 预连接可以提前建立连接
2. HTTP/1.1 域名分片策略
2.1 传统分片实现
NOTE
域名分片是HTTP/1.1时代的优化策略,用于突破浏览器对同一域名的并发请求限制。
优势:
- 突破同域名并发限制
- 提高资源加载速度
- 适合HTTP/1.1环境
劣势:
- 增加DNS解析开销
- 增加服务器连接数
- 维护成本高
javascript
// 域名分片管理器
class DomainShardingManager {
constructor(domains) {
this.domains = domains;
this.currentIndex = 0;
this.resourceMap = new Map();
}
// 轮询分配域名
getNextDomain() {
const domain = this.domains[this.currentIndex];
this.currentIndex = (this.currentIndex + 1) % this.domains.length;
return domain;
}
// 资源分片
shardResource(resource) {
const domain = this.getNextDomain();
const url = `https://${domain}/${resource}`;
this.resourceMap.set(resource, url);
return url;
}
}
// 使用示例
const shardingManager = new DomainShardingManager([
'cdn1.example.com',
'cdn2.example.com',
'cdn3.example.com'
]);
2.1 HTTP/2特性利用
WARNING
HTTP/2的多路复用特性使得域名分片不再必要,甚至可能产生负面影响。
HTTP/2优势:
多路复用:
- 单个TCP连接可以处理多个请求
- 避免了TCP连接数限制
- 减少了握手开销
二进制分帧:
- 更高效的数据传输
- 更好的错误处理
- 更低的延迟
graph TD A[HTTP/2优势] --> B[多路复用] A --> C[头部压缩] A --> D[服务器推送] A --> E[二进制分帧] B --> F[单连接并行传输] C --> G[减少带宽占用] D --> H[主动推送资源] E --> I[更高效传输]
3. 最佳实践建议
3.1 HTTP/2环境
避免域名分片:
- 使用单个强大的域名
- 充分利用多路复用
- 减少DNS查询开销
资源提示:
- 使用
preload
加载关键资源 - 使用
preconnect
提前建立连接 - 适度使用
dns-prefetch
- 使用
3.2 混合环境
TIP
在同时支持HTTP/1.1和HTTP/2的环境中,建议:
协议检测:
- 根据协议版本动态调整策略
- HTTP/2环境下合并域名
- HTTP/1.1环境下适度分片
渐进式优化:
- 优先考虑HTTP/2优化
- 保持对HTTP/1.1的基本支持
- 监控性能指标动态调整
4. 性能监控
4.1 关键指标
资源加载时间:
- DNS解析时间
- TCP连接时间
- 首字节时间(TTFB)
- 资源下载时间
并发请求数:
- 活跃连接数
- 排队请求数
- 完成请求数