update at 2026-02-11 11:06:24

This commit is contained in:
douboer
2026-02-11 11:06:24 +08:00
parent 4903ff63c1
commit a582bf09a8
3 changed files with 118 additions and 1 deletions

68
PLAN.md
View File

@@ -123,6 +123,74 @@
- 风险CDN 缓存导致短时间读取旧配置(通过短缓存 + 原子发布缓解)。
- 回滚:将 A/B 两端 `active` 同步改回原服务器,并设置 `cooldownMinutes=0` 可快速恢复。
### 0.10 非付费负载均衡预案Cloudflare Workers暂不实施
目标:
- 在不使用 Cloudflare Load Balancer 付费能力的前提下,实现 A/B 两端流量分发与故障回退。
- 小程序侧统一使用单一入口域名,减少合法域名和切换复杂度。
建议架构:
1. 新增统一入口域名(示例:`mp-api.biboer.cn`),仅小程序访问该域名。
2. 入口域名绑定 Cloudflare Worker 路由(`mp-api.biboer.cn/*`)。
3. Worker 负责:
- `/api/*` 按权重分流到 A/B初始建议 A:90%B:10%)。
- 主节点失败时自动重试备用节点(一次重试即可)。
- `GET/HEAD` 以外请求复用同一请求体,避免重试时 body 丢失。
4. 静态配置与字体资源在首阶段固定走 A`fonts.biboer.cn`),避免 A/B 字体清单不一致引起渲染差异。
权重修改与热加载(推荐):
1. 不将权重硬编码在 Worker 代码中,避免每次改权重都重新发布。
2. 新增独立配置文件(示例:`/miniprogram/assets/lb-config.json`),由 Worker 定期拉取。
3. Worker 本地缓存最近一次有效配置,按 TTL建议 30~60 秒)自动刷新。
4. 权重调整流程仅需改配置文件并发布配置,无需小程序发版、无需 Worker 重新部署。
`lb-config.json` 建议结构:
```json
{
"weights": {
"A": 90,
"B": 10
},
"ttlSeconds": 60,
"minSwitchIntervalSeconds": 30
}
```
字段约束:
- `weights.A``weights.B``0~100`,且总和必须为 `100`
- `ttlSeconds`Worker 重新拉取配置间隔,建议 `30~60`
- `minSwitchIntervalSeconds`:最小切换间隔,避免流量来回抖动。
前置条件(实施前必须满足):
1. A/B 字体文件与清单一致(当前 `fontCount` 必须对齐)。
2. A/B API 行为一致:`/healthz``/api/render-svg``/api/render-png`
3. 小程序后台已配置统一入口域名为合法 `request/downloadFile` 域名。
分阶段实施:
1. P0演练
- 先用 Worker 做单域名透传100% A验证链路稳定性。
2. P1灰度
- 开启 `/api/*` 90/10 分流,观察失败率与时延(至少 24 小时)。
3. P2增配
- 视稳定性逐步调整 80/20、70/30不直接跳 50/50。
4. P3稳态
- 形成标准运维流程:权重调整、紧急回切、日志巡检。
回滚策略:
1. Worker 立即切为 100% A。
2. 若 Worker 故障DNS/路由回退到 A 直连入口。
3. 保留 `route-config` 手动切换机制作为最终兜底,不删除。
配置容错(实施时必须包含):
1. 配置拉取失败:继续使用“上一次有效配置”,不回退空配置。
2. 配置格式非法:记录错误并忽略本次配置,继续使用旧配置。
3. 连续失败超过阈值:自动降级到 `A=100, B=0`,并输出告警日志。
暂不实施说明:
- 本节仅记录方案和执行顺序,当前版本继续使用“手动 A/B 切换”主路径。
- 待 A/B 数据一致性、日志与监控项完善后,再启动该预案实施。
## 1. 当前状态
### 1.1 已完成(保留能力)