Skip to content

Commit 3b05789

Browse files
committed
perf(cdn): 放宽源站限流并新增 OSS 源站同步以加速预热
预热需每个边缘节点各拉一份完整文件,回源总量=节点数x172MB,而 ECS 出网 仅约 6Mbps,导致预热耗时几十分钟至数小时且打满带宽影响 API。 A. nginx /downloads/ 移除 limit_rate、并发 8/24 放宽至 32/64: 接入 CDN 后该路径只服务 CDN 回源与少量直连兜底,原限流已只剩副作用, 多节点并发回源易撞上限被拒 503 而使预热失败或极慢 B. release.yml 新增 OSS 上传(CDN 源站):OSS 出网带宽极大,可使预热降至 分钟级且完全不占用 ECS。路径与 ECS 一致(downloads/ 前缀),故无需改 DOWNLOAD_BASE_URL、前端与 electron-updater 配置;ECS 同步保留作兜底 与存量客户端更新源。未配置 OSS_BUCKET 时该步骤跳过 文档修正先前判断:原结论'CDN 回源 ECS 即可,不需要 OSS'漏算了预热回源量, 已改为推荐 CDN + OSS 源站并附回源量估算表。
1 parent 434847f commit 3b05789

3 files changed

Lines changed: 66 additions & 15 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,45 @@ jobs:
148148
target: /opt/Entropydecrease/downloads
149149
strip_components: 1
150150

151+
# ---------------------------------------------------------------
152+
# 同步至 OSS(CDN 源站)
153+
# 为何需要 OSS:ECS 出网仅约 6Mbps,而 CDN 预热需**每个边缘节点各
154+
# 拉一份完整文件**,回源总量 = 节点数 x 172MB,以 ECS 为源站时
155+
# 预热耗时达几十分钟至数小时且会打满带宽影响 API。
156+
# OSS 出网带宽极大,可使预热降至分钟级且完全不占用 ECS。
157+
#
158+
# 路径与 ECS 保持一致(downloads/ 前缀),因此无需改变
159+
# DOWNLOAD_BASE_URL,也无需改前端与 electron-updater 配置。
160+
# ECS 同步仍保留:存量客户端的更新源仍指向 ECS,且作为兜底。
161+
# ---------------------------------------------------------------
162+
- name: Upload to OSS (CDN origin)
163+
if: ${{ secrets.OSS_BUCKET != '' && secrets.ALIYUN_ACCESS_KEY_ID != '' }}
164+
env:
165+
AK_ID: ${{ secrets.ALIYUN_ACCESS_KEY_ID }}
166+
AK_SECRET: ${{ secrets.ALIYUN_ACCESS_KEY_SECRET }}
167+
OSS_BUCKET: ${{ secrets.OSS_BUCKET }}
168+
# 未配置时默认杭州(与 ECS 同地域)
169+
OSS_ENDPOINT: ${{ secrets.OSS_ENDPOINT || 'oss-cn-hangzhou.aliyuncs.com' }}
170+
FILE_NAME: ${{ steps.meta.outputs.file }}
171+
run: |
172+
set -eo pipefail
173+
curl -sL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz -o /tmp/aliyun.tgz
174+
tar -xzf /tmp/aliyun.tgz -C /tmp
175+
176+
oss_cp() {
177+
/tmp/aliyun oss cp "$1" "oss://$OSS_BUCKET/downloads/$2" \
178+
--force -e "$OSS_ENDPOINT" -i "$AK_ID" -k "$AK_SECRET"
179+
}
180+
181+
cd release-windows-latest
182+
# 同 ECS 的顺序约定:先二进制后元数据,避免 latest.yml 率先就位
183+
# 而指向尚未上传完成的安装包
184+
oss_cp "$FILE_NAME" "$FILE_NAME"
185+
oss_cp "$FILE_NAME.blockmap" "$FILE_NAME.blockmap"
186+
oss_cp latest.yml latest.yml
187+
oss_cp latest.json latest.json
188+
echo "OSS sync done: oss://$OSS_BUCKET/downloads/"
189+
151190
# 保留策略:仅保留最近 3 个版本的安装包,防止磁盘增长
152191
- name: Prune old versions (keep last 3)
153192
uses: appleboy/ssh-action@v1

‎docs/knowledge/solutions/2026-07-installer-cdn-distribution.md‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,29 @@
3030

3131
## 方案描述
3232

33-
### 架构选择:CDN 回源 ECS(推荐)vs CDN + OSS 源站
33+
### 架构选择:CDN + OSS 源站(推荐)vs CDN 回源 ECS
34+
35+
> ⚠️ **本节结论已根据实测修正**。最初判断为“安装包是固定文件、缓存命中率高、回源次数少,故 CDN 回源 ECS 即可”,**该判断漏了预热这一环**:预热需要**每个边缘节点各拉一份完整文件**,回源总量 = 节点数 × 文件大小,在小带宽源站上代价极大。
3436
3537
| 维度 | CDN 回源 ECS | CDN + OSS 源站 |
3638
|------|-------------|---------------|
37-
| 新增组件 | 仅 CDN | CDN + OSS |
38-
| CI 改造 | **无需改动**(沿用现有 scp 同步) | 需新增 OSS 上传步骤 |
39-
| 缓存命中率 | 接近 100%(安装包为固定文件) | 同 |
40-
| ECS 负担 | 仅回源(每版本每节点一次) | 无 |
41-
| 源站可用性 | ECS 故障时无法回源(但已缓存内容仍可服务) | 更高 |
39+
| 源站出网带宽 | 实测约 **6 Mbps(瓶颈)** | 极大(共享大带宽) |
40+
| 预热耗时(172MB) | 几十分钟~数小时 | **通常分钟级** |
41+
| 预热是否影响 API | 会打满 ECS 带宽 | **完全不影响** |
42+
| 存储成本 | 0 | 约 **0.06 元/月**(0.5GB) |
43+
| CI 改造 | 无 | 需一步 OSS 上传 |
44+
45+
**预热回源量估算(ECS 为源站时)**:
46+
47+
| 预热节点数 | 回源总量 | 耗时(@770KB/s) |
48+
|-----------|---------|------------------|
49+
| 5 | 860 MB | 约 19 分钟 |
50+
| 10 | 1.7 GB | 约 37 分钟 |
51+
| 30 | 5.2 GB | 近 2 小时 |
52+
53+
且每次发版文件名变更均需重新预热,故以小带宽 ECS 作源站不可持续。
4254

43-
安装包是**内容不变的静态文件**,CDN 缓存命中率接近 100%,回源仅在新版本发布后每节点首次发生。因此 **CDN 回源 ECS 即可解决绝大部分带宽问题**,且改造量最小。OSS 方案可作为后续演进(追求源站高可用时)。
55+
**OSS 路径约定**:上传至 `oss://<bucket>/downloads/`,与 ECS 保持一致,因此切换源站时**无需改变 `DOWNLOAD_BASE_URL`、前端与 electron-updater 配置**。ECS 同步仍保留(存量客户端更新源仍指向 ECS,兼作兜底)。
4456

4557
### 下载源可切换设计
4658

‎server/nginx/nginx.conf‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,14 +222,14 @@ http {
222222
location ^~ /downloads/ {
223223
root /usr/share/nginx;
224224
autoindex off;
225-
# 实测(RTT 仅 21ms,已排除延迟因素):单流约 140KB/s 且启用 BBR 前后无
226-
# 差异,单流受限原因未明;但多流可叠加:4 并发 500KB/s、8 并发 764KB/s。
227-
# 故单 IP 并发放宽至 8:既兼容多线程下载器(限 4 会使超出连接被拒 503),
228-
# 也实测提升总吞吐。limit_rate 2m 远高于实际速率,仅作异常保护上限。
229-
# 注:浏览器默认单连接,因此普通用户仍只能得到 ~140KB/s,根治需 CDN。
230-
limit_rate 2m;
231-
limit_conn dl_conn 8;
232-
limit_conn dl_total 24;
225+
# 接入 CDN 后本路径主要服务 CDN 回源(少量、可信)与少量直连兜底,
226+
# 不再承载大量用户直接下载,故原限流已只剩副作用:
227+
# CDN 预热时多个边缘节点并发回源,易撞上并发上限而被拒(503),
228+
# 导致预热失败或极慢(预热需每节点各拉一份完整文件)。
229+
# 故移除 limit_rate(回源越快预热越快)并大幅放宽并发;
230+
# 仍保留上限以防异常爬取耗尽连接。
231+
limit_conn dl_conn 32;
232+
limit_conn dl_total 64;
233233

234234
# 更新元数据(latest.yml / latest.json)禁止缓存,
235235
# 否则客户端会长期读到旧版本信息;允许 www 子域跨域读取

0 commit comments

Comments
 (0)