1.
准备工作与版本策略
- 确认游戏静态资源(index.html、js、wasm、图片、音频)已打包到 dist/ 目录。
- 采用语义化版本或时间戳目录,如 v1.0.0/ 或 20260823-1234/,保证不可变资源的长期缓存。
- 生成 manifest.json 或 release.json,记录当前发布版本与资源映射,便于灰度与回滚。
2.
选择 CDN 与 Origin 类型
- 可选方案:对象存储作为 Origin(AWS S3、阿里 OSS、腾讯 COS)或自建 Nginx。
- 若用 S3/OSS,配置静态站点与权限;若用 Nginx,确保支持 gzip、brotli、正确的 Cache-Control。
- 开通 CDN 服务并绑定域名,配置回源域名指向你的对象存储或服务器。
3.
上传资源到 Origin(示例命令)
- S3 示例:aws s3 sync ./dist s3://your-bucket/v20260823 --delete --metadata-directive REPLACE --cache-control "max-age=31536000"
- OSS 示例:ossutil cp -r ./dist oss://your-bucket/v20260823/ --mime-type auto --meta Cache-Control:max-age=31536000
- 上传后校验 hash(md5/sha1)与文件完整性。
4.
使用“版本指针”实现无缝发布
- 在 Origin 根目录放置一个当前版本指针文件 current -> 指向 v20260823(可以是一个小的 index.html 或 JSON 文件)。
- CDN 默认缓存指针文件,可以将指针的 Cache-Control 设置为短时间(如 60s),资源本身设置长缓存。
- 发布时只需更新指针文件并发起 CDN 指针路径失效即可完成切换,减少全量缓存失效。
5.
灰度发布设计(基于路径/Cookie/请求头)
- 方法A(路径切分):保留 v1/v2 两套目录,通过 CDN 边缘规则按流量比例或用户分组把一部分请求 rewrite 到 /v2/。
- 方法B(Cookie/请求头):前端在访问时带上特定 cookie(如 X-Canary=1),CDN 或边缘函数根据 cookie 选择 v2。
- 方法C(域名子域):canary.example.com 指向 v2,逐步把用户引导到子域进行灰度。
6.
在 CDN 上配置路由规则或边缘函数
- 常见操作:在 CDN 控制台添加规则(如果支持按 cookie/请求头路由),或使用边缘计算:CloudFront Lambda@Edge、Cloudflare Workers、Fastly VCL。
- 规则示例(伪代码):if Cookie contains "canary=1" then rewrite / -> /v20260823/ else rewrite -> /v20260701/。
- 部署后先小流量验证,观察日志与错误率。
7.
设置缓存策略与缓存穿透防护
- 静态资源:Cache-Control: max-age=31536000, immutable;指针/manifest:Cache-Control: max-age=60。
- 对于频繁更新的资源(如 index.html),使用版本化文件名(带 hash)或短缓存。
- 防止缓存穿透:Origin 层开启 gzip、连接池并限制请求速率,必要时启用 CDN WAF。
8.
自动化部署脚本与 CI 集成
- 建议 CI 步骤:build -> upload to origin (vX) -> upload manifest -> update canary pointer(或调用 CDN API)-> create invalidation(仅指针路径)。
- 示例 GitLab CI 阶段:deploy_to_origin: script: - aws s3 sync ./dist s3://bucket/v$CI_PIPELINE_ID/ ... then - aws s3 cp manifest.json s3://bucket/current_manifest.json --cache-control no-cache
9.
灰度监控与回滚判断点
- 指标:页面加载时间、JS 错误率(RUM)、后端接口错误、留存/行为埋点。设定阈值,例如 JS 错误率上升 50% 即触发回滚。
- 日志与埋点提前接入,灰度首小时频繁检查,若问题出现立即触发回滚流程。
10.
回滚操作步骤(安全快速)
- 如果使用版本指针:把 current 指针恢复到上一个稳定版本并下发短缓存使边缘尽快生效,然后针对指针路径做 CDN Invalidation(或等短缓存到期)。
- 如果使用路由规则:撤回或修改灰度规则,把流量全部导回稳定版本;如用边缘函数,回退到旧逻辑。
- 同时回滚 origin 上的问题代码或删除问题版本,记录回滚原因并触发问题排查流程。
11.
CDN 缓存失效与成本控制
- 仅失效指针或少量路径,避免大面积失效造成大量回源流量。
- 使用 Cache-Control 与文件名哈希配合,减少需要主动清除的场景。注意云厂商的失效请求有配额,提前规划。
12.
演练与安全检查清单
- 定期演练灰度与回滚流程(在非高峰时段)。
- 检查点:版本文件完整、指针生效、CDN 规则正确、监控报警触发正常、回滚权限与脚本可用。
13.
问:如何在不影响所有用户的情况下快速回滚?
- 答:使用指针文件或路由规则将流量切回到上一个稳定版本,这通常只需修改一份 manifest 或 CDN 规则并触发对该路径的短期失效,完成时间取决于指针的缓存时间与 CDN 在边缘的刷新速度。
14.
问:灰度发布时如何选择流量分配比例?
- 答:建议从 1%-5% 起步,观察关键指标 30-60 分钟无异常后逐步放大到 10%-25%,再评估放全量。分配方式可基于 cookie、用户 ID hash 或百分比采样实现。
15.
问:常见部署错误与排查要点有哪些?
- 答:常见错误包括缓存策略错误导致无法看到新版本、资源跨域/权限问题、缺少 Content-Type 或 gzip 设置。排查顺序:浏览器网络面板查看路径和响应头 -> CDN 日志查看回源行为 -> 验证 origin 文件是否存在与权限。