CDN 与静态化
静态资源(图片、JS/CSS、页面)占流量大头,但不需要应用服务器计算。动静分离把静态流量卸到 CDN,应用只服务动态请求。面试主线:CDN 怎么工作、静态化解决什么。
动静分离
| 类型 | 内容 | 载体 |
|---|---|---|
| 静态 | 图片、CSS/JS、字体、预渲染页面 | CDN / 对象存储 |
| 动态 | API、个性化内容 | 应用服务器 |
- 静态资源由浏览器/边缘直接拿,不经过应用
- 应用只处理动态请求,QPS 压力大幅下降
- 规范实践:静态资源独立域名(
static.example.com),便于 CDN 接入和 Cookie 隔离
CDN 工作原理
CDN: 边缘缓存 + 回源
- 边缘节点:全球/全国分布的缓存服务器,用户请求被 DNS 解析到最近的节点
- 命中:边缘有缓存直接返回,用户无感知加速
- 回源:边缘没缓存,回源站取一次,之后本地缓存
- 关键参数:缓存命中率(90%+ 是健康水平)、回源带宽(回源多说明命中率低)
静态化
把动态内容预渲染成静态文件:
| 场景 | 做法 |
|---|---|
| 页面 | 模板预渲染成 HTML,定期重建(数据变化时触发) |
| 列表/详情 | 生成静态 JSON/HTML 放 CDN,变化时失效重建 |
| 图片处理 | 上传时生成多尺寸,CDN 分发 |
静态化收益:页面不经过应用(QPS 压力归零)、CDN 就近加速、抗流量冲击。代价:内容有延迟(重建周期内是旧数据)、发布流程复杂(重建/失效机制)。
缓存失效与版本
- 文件名哈希:JS/CSS 带内容哈希(
app.a1b2c3.js),发布即新 URL,天然失效 - CDN 主动刷新:内容更新时调用 CDN API 刷新缓存
- Cache-Control:静态资源长缓存(
max-age=31536000),动态接口不缓存或短缓存
面试追问
- 动静分离解决什么? 静态流量不进应用,应用只服务动态请求。QPS 压力和带宽成本大幅下降
- CDN 怎么加速? 边缘节点就近响应,命中直接返回。回源只发生在冷缓存时
- CDN 命中率低怎么办? 查缓存头(Cache-Control 没设长缓存)、key 设计(URL 带随机参数)、预热
- 静态化的代价? 内容延迟(重建周期内旧数据)、发布流程复杂。适合变化不频繁的内容
- 静态资源怎么发布? 文件名哈希 + CDN 刷新。哈希 URL 天然缓存失效,不需要手动清缓存