最近在维护 A Tour of Go 多语言项目时,我遇到了一个很典型的问题:
网站平时访问很快,Cloudflare 缓存已经 HIT 的页面基本没有异常。
但只要发布新版本、清除缓存,或者访问一个还没有进入缓存的资源,出现 MISS,请求就可能突然变慢,甚至超时。
我的非中文语言站目前大多使用 Cloudflare 免费版,源服务器仍然位于中国大陆的阿里云杭州。
大致链路是:
用户
↓
Cloudflare
↓
阿里云杭州源站缓存 HIT 时,源站甚至可能完全不参与。
真正的问题,往往只有在 cold MISS 需要回源之后才会暴露出来。
这次排查过程中,我一度已经考虑把源服务器迁到海外,或者把非中文站全部从 Cloudflare 切回 EdgeOne。
最终都没有这么做。
我最后开启的是 Cloudflare Smart Tiered Cache。
而它带来的改善,比我一开始预期的明显得多。
一开始,我主要是在提高自己的部署成功率
这个问题不是某一天突然发现,然后一次解决掉的。
从 Git 历史可以看到,我前期做的事情主要还是:
让 Production workflow 更能够容忍公网瞬态故障。

连续几次修改包括:
fix: 增强生产公网验收瞬态容错
fix: 完善生产冷缓存瞬态容错
fix: 分阶段执行多语言生产维护
fix: 完善生产恢复预检与 CDN 隧道重试
fix: 增强生产浏览器错误诊断
docs: 记录 Smart Tiered Cache 生产基线最开始这些修改的目的其实非常明确:
提高我自己一次 Production 发布成功完成的概率。
比如:
curl exit 28这种 transport timeout 做 bounded retry;- Cloudflare
522、525等短暂网络错误允许有限重试; - browser navigation 增加有限 convergence;
- 长时间任务加入恢复状态;
- failure 时保留更明确的网络 evidence。
这些优化本身都有价值。
假设一次发布要验收 10 个语言站,而其中某一个请求恰好因为公网波动第一次失败,就让整个发布立即中止,确实不太合理。
但做到后面,我逐渐意识到:
这些优化主要解决的是“我的部署是不是容易失败”,并没有改善真正的网站用户在 cold MISS 时的访问体验。
比如,我把 timeout 从 15 秒增加到 25 秒,可以让 verifier 更有机会等到请求最终成功。
但是用户打开网页时:
他仍然可能在那里等 20 多秒。
我的部署脚本可以:
第一次失败
→ 等 1 秒
→ 再试一次
→ 成功于是 Production 通过了。
但普通用户并不会因为我的部署脚本变聪明,就自动获得更好的第一次访问体验。
所以这件事其实需要拆成两个问题:
部署侧:
怎样避免短暂网络波动导致整个 Production 批次失败?
用户侧:
怎样真正改善 Cloudflare cold MISS 回源阿里云杭州时的体验?前者可以通过 bounded retry 改善。
后者必须处理真实网络路径。
一个 cold MISS 曾经等了约 21.8 秒
真正让我开始认真看待回源链路的,是一次 cold MISS。
正式 Production 中曾经观察到:
一个请求大约 21.8 秒之后才最终成功。

也正因为这个真实结果,我后来把部分 Production readiness 的单次请求上限调整到了 25 秒。
这里很容易产生误解。
把 timeout 调高,并不是说:
网站请求 25 秒才返回也可以接受。
它只是为了防止真实请求在第 21.8 秒成功时,Production verifier 第 15 秒就提前判定失败。
这解决的是自动化验收的误判问题。
它没有解决真正的访问速度问题。
也就是从这里开始,我越来越明确地区分:
HIT 的速度和:
MISS 的回源速度如果平时打开的是一个已经缓存好的页面,Cloudflare 可能很快就返回。
这根本不能证明:
Cloudflare 到阿里云杭州的真实回源路径同样很快。
HIT 很快,并不代表回源很快
缓存 HIT 时,可以非常粗略地理解成:
用户
↓
Cloudflare Edge
↓
缓存
↓
用户阿里云杭州源站可能完全没有收到这个请求。
但是没有 Tiered Cache 时,一个 cold MISS 更接近:
用户
↓
Cloudflare Edge
↓
本地缓存 MISS
↓
阿里云杭州
↓
Cloudflare
↓
用户真正不稳定的很可能就是:
某个 Cloudflare Edge
→
阿里云杭州所以我当时看到的是一种很典型的现象:
缓存已经热起来:
很快
刚刚 purge:
可能很慢
某个冷门 Angular partial 第一次访问:
可能很慢
再访问:
又很快如果只是日常刷新一个已经 HIT 的首页,很容易误以为:
网站完全没有问题。
当时我已经开始考虑两个更大的方案
做到这里时,我其实已经不只是想调 timeout 了。
如果 Cloudflare 回中国大陆源站这条链路本身长期不稳定,那么更直接的做法就是改变架构。
我当时主要考虑过两个方案。
方案一:把源服务器迁到海外 zgocloud
第一个想法是:
直接把 Production origin 从阿里云杭州迁到海外的 zgocloud。
这样可以从根本上改变:
Cloudflare
→
中国大陆源站这条跨区域回源路径。
从网络角度看很直接。
但它不是换一个配置,而是迁移整个 Production origin。
涉及:
Nginx
systemd
release 目录
部署流程
证书
备份
安全
监控
故障恢复而且我还有一个当时没有确认清楚的问题:
备案与接入关系。
工信部现行规则明确要求,在中华人民共和国境内提供非经营性互联网信息服务应依法履行备案手续。(工业和信息化部)
但如果我把现有实际 origin 迁到境外,同时还保留部分境内基础设施,现有备案、接入商以及后续变更应该如何处理,我当时并没有确认清楚。
所以我不愿意为了一个 CDN cold MISS 问题,直接引入一整套新的政策和架构不确定性。
方案二:非中文站全部切回 EdgeOne
另一个方案是:
既然源服务器本来就在阿里云杭州,那么非中文语言站是不是也不要继续使用 Cloudflare,而是全部切回 EdgeOne?
这个方案技术上也很自然。
中文站本来就在使用 EdgeOne。
如果全部改成更适合中国大陆源站的 CDN 架构,也许可以直接规避现在这条 Cloudflare 回源路径。
但这个方案还有一个非常现实的问题:
成本。
我现在这些非中文 community locale 使用的是 Cloudflare 免费版。
随着语言数量继续增长:
10 个站
20 个站
30 个站
……如果全部切换到持续产生实际费用的 CDN,长期运营成本会同步增加。
而目前 A Tour of Go 多语言项目的广告收入仍然很低。
除此之外,现在的:
Cloudflare Cache Rule
hostname purge
shared assets
Production verifier
新增 locale Production baseline都已经围绕 Cloudflare community locale 形成了稳定流程。
全部切回 EdgeOne,也意味着现有 Production 架构需要重新迁移。
所以,我先找 Cloudflare 自己有没有更小的解决方案
当时真正的选择其实变成:
方案 A:
迁到海外 origin
→ 改动最大
→ 备案与接入边界需要确认
方案 B:
全部切回 EdgeOne
→ 技术可行
→ 长期 CDN 成本更高
方案 C:
继续使用 Cloudflare
→ 优先优化 Cloudflare 自己的回源拓扑在真正做前两个大改动之前,我决定先试第三种。
于是开始认真看:
Smart Tiered Cache。
Smart Tiered Cache 到底改变了什么?
在 Cloudflare Dashboard:
缓存
→ Tiered Cache我最终启用了:
Smart Tiered Cache当前显示:
Tiered Cache Topology: Active
Cloudflare 官方对 Tiered Cache 的解释是:
把数据中心分成 lower tier 和 upper tier。
如果 lower tier 没有内容,并不会立即访问 origin,而是先去询问 upper tier。
只有 upper tier 也没有内容,才由 upper tier 访问真正的 origin。(Cloudflare Docs)
所以链路变成:
用户
↓
Lower-tier Edge
↓
Upper Tier
↓
Origin看起来反而比以前多了一层。
这也是我一开始最困惑的地方:
明明多经过一个节点,为什么反而更快了?
三层网络为什么可能比两层更快?
没有 Tiered Cache 时,一个 MISS 可能是:
用户
↓
某个 Cloudflare Edge
↓
阿里云杭州真正决定回源质量的是:
这个 Edge
→
阿里云杭州如果这条路径质量不好,节点再少也没有意义。
开启 Smart Tiered Cache 后,路径可能变成:
用户
↓
Lower Tier
↓
Cloudflare 网络
↓
选定的 Upper Tier
↓
阿里云杭州虽然多了一跳,但新增的主要是 Cloudflare 自己网络内部的一段。
更重要的是:
真正有资格去访问 origin 的节点被收敛到了 upper tier。
Smart Tiered Cache 还不是随机选一个 upper tier。
Cloudflare 官方说明,它会使用自己的性能和路由数据,并收集各数据中心访问 origin 时的 latency,然后为 origin 动态选择连接延迟较低的 upper tier。(Cloudflare Docs)
所以:
节点更少并不等于:
一定更快网络真正重要的是:
整条路径的质量如果增加的是一段 Cloudflare 内部网络,却把:
任意 Edge → 阿里云杭州变成:
更适合访问这个 origin 的 Upper Tier → 阿里云杭州那么整体完全可能反而更快。
更重要的是:Lower Tier MISS,不再等于 Origin MISS
这其实是我后来觉得 Tiered Cache 最重要的一点。
开启之后,一个请求可能是:
Lower Tier:MISS
↓
Upper Tier:HIT
↓
直接返回这种情况下:
阿里云杭州根本不会收到请求。
Cloudflare 官方也明确说明,Tiered Cache 的目标之一就是让 lower tier MISS 先查询 upper tier,从而提高整体缓存命中率并减少真正到达 origin 的请求。(Cloudflare Docs)
更有意思的是:
如果 lower tier 自己没有缓存,但 upper tier 已经 HIT,那么最终用户看到的:
CF-Cache-Status仍然可以直接是:
HITCloudflare 官方文档明确提到:第一次从 upper tier 填充本地数据中心缓存时,响应可以显示 HIT;这个 HIT 反映的是 upper-tier 命中,而不是这个 local Edge 原来已经有缓存。第一次这种响应甚至可能还没有 Age,之后真正从 local cache 命中时才出现。(Cloudflare Docs)
这意味着一个非常重要的区别:
Local Edge MISS
≠
Origin MISS以前某个 Edge 第一次访问某个 URL,很可能意味着:
重新访问一次阿里云杭州现在则可能只是:
Lower Tier MISS
→ Upper Tier HIT
→ 根本不访问阿里云杭州一个 URL 是不是只需要一次真正 MISS?
在理想情况下,可以这么理解,但必须加限定。
假设:
- cache key 完全相同;
- 内容仍然 fresh;
- upper tier 没有被 eviction;
- 没有 purge;
- Smart Tiered Cache 的 upper-tier assignment 没变化;
那么可能出现:
第一次请求:
东京 Lower Tier MISS
→ Upper Tier MISS
→ 阿里云杭州
→ 用户看到 MISS之后另外一个地区第一次访问:
洛杉矶 Lower Tier MISS
→ Upper Tier HIT
→ 用户看到 HIT德国:
德国 Lower Tier MISS
→ Upper Tier HIT
→ 用户看到 HIT法国:
法国 Lower Tier MISS
→ Upper Tier HIT
→ 用户看到 HIT于是从 origin 的角度看:
同一个 cache key 在这一轮缓存生命周期里,可能只需要第一次真正回源阿里云杭州。
后面虽然不同 lower-tier Edge 都经历过自己的 local MISS,但它们可以直接从 upper tier 获得内容。
这也正是 Tiered Cache 能大幅减少 origin request 的原因。(Cloudflare Docs)
当然,这不代表一个 URL 永远只会有一次真正 MISS。
以下情况都可能再次触发真正回源:
- 主动 purge;
- TTL 到期;
- upper tier 缓存被 eviction;
- cache key 改变;
- upper tier assignment 发生变化;
- origin / DNS / topology 变化。
Cloudflare 也明确说明,如果 Smart Tiered Cache 重新选择了 upper tier,新 upper tier 需要重新填充缓存,因此可能暂时增加 MISS rate。(Cloudflare Docs)
这也解释了为什么我自己的 Production 会突然快很多
我的 Production verifier 并不是普通用户。
它会从正式公网 runner 请求:
首页
课程页面
Angular partial
sitemap 中的 105 个 URL
缓存状态
browser 页面没有 Tiered Cache 时可能是:
verifier
↓
某个 Cloudflare Edge
↓
MISS
↓
直接回源阿里云杭州于是每碰到一个新的 Edge / cold object,都可能重新经历一次不稳定的跨区域回源。
Smart Tiered Cache 开启后则可能有两种情况。
第一种:
Lower Tier MISS
→ Upper Tier HIT
→ 根本不访问杭州第二种:
Lower Tier MISS
→ Upper Tier MISS
→ 由选定的 Upper Tier 回源杭州第二种虽然仍然真正访问源站,但已经不是任意 lower-tier Edge 去访问,而是 Cloudflare 为这个 origin 选择的 upper tier。
所以 Production verifier 自己也直接受益。
不过这里我不想凭现有 evidence 断言:
之所以变快,主要是因为 Upper Tier 已经全部 HIT。
我没有逐个请求掌握足够 evidence 去计算:
多少请求是 Upper Tier HIT
多少请求是真正由 Upper Tier 回源能够确认的是:
开启 Smart Tiered Cache 之后,同类 fresh MISS 的表现明显改善。
开启之后:之前失败的 fresh MISS 变成了 10/10 成功
开启 Smart Tiered Cache 后,我重新测试了此前出问题的 Angular partial fresh MISS。
结果:
10/10 HTTP 200单次大约:
0.3~0.4 秒
这与此前真实观察到:
约 21.8 秒才成功形成了非常明显的反差。
后来我把 Smart Tiered Cache 正式记录进当前 Production baseline。
不过这里还是需要保持一个边界:
21.8 秒,是之前实际出现过的一次异常 cold MISS;
0.3~0.4 秒,是开启之后那一轮 10 次 fresh MISS 复测。
这足以让我判断:
Smart Tiered Cache 非常值得保留。
但不能因此写成:
Smart Tiered Cache 永久把访问延迟从 21.8 秒优化成了 0.3 秒。
这不是严格控制变量的 benchmark。
我没有配置 Alibaba Cloud 的 Cloud Region Hint
Cloudflare 现在还支持针对部分 public cloud origin 设置 cloud region hint。
这样可以直接告诉 Smart Tiered Cache:
origin 属于哪一家云厂商、哪个 region。
但 Cloudflare 当前官方列出的 provider 是:
- AWS
- GCP
- Azure
- Oracle Cloud
没有 Alibaba Cloud。(Cloudflare Docs)
所以我的阿里云杭州源站没有配置:
Alibaba Cloud Hangzhou之类的 region hint。
当前就是让 Smart Tiered Cache 使用 Cloudflare 自己采集的 latency / routing data 去选择 upper tier。
从目前实际结果看,这已经够用了。
Smart Tiered Cache 不会消灭 MISS
开启之后,真实 Production 发布仍然可以看到:
CDN /: MISS -> HIT -> HIT PASS
CDN /tour/welcome/1: MISS -> HIT -> HIT PASS
这是很正常的。
我每次发布新的 release 后都会正式 purge 对应 hostname cache。
Cloudflare 官方说明,按 hostname purge 后,后续请求通常会重新出现 MISS;使用 Tiered Cache 时也可能出现 EXPIRED,具体取决于 lower tier、upper tier 的状态以及请求落到哪里。(Cloudflare Docs)
所以:
MISS
→ HIT
→ HIT本身并不说明 Tiered Cache 没有作用。
真正要关注的是:
这个 MISS 最后有没有真的到 origin。
有了 Tiered Cache 之后:
Lower Tier MISS已经不能简单理解成:
必须回源阿里云杭州开启 Smart Tiered Cache 后,为什么仍然会有 curl exit 28?
更有意思的是:
Smart Tiered Cache 已经开启之后,今天真实 Production 中还是发生了一次:
curl exit 28
HTTP-000出现在荷兰语站 nl-NL 的 sitemap verification。

第一次:
attempt=1/5
reason=curl-exit-28
HTTP-000第二次:
attempt=2/5 PASS最终:
sitemap URLs: 105/105
host mismatch: 0
HTTP failure: 0
PRODUCTION MACHINE ACCEPTANCE: PASS这正好说明:
Smart Tiered Cache 不是网络稳定性的魔法开关。
Internet 上依然可能存在:
连接建立超时
短暂丢包
节点瞬态异常
路由变化
CDN 内部波动因此我之前做的 bounded retry 并没有失去意义。
只是它和 Smart Tiered Cache 解决的是两个不同层次的问题。
Smart Tiered Cache 与 bounded retry,是两层完全不同的优化
现在我更倾向于把它们这样理解。
第一层:
改善真实用户也会经历的网络架构。
Smart Tiered Cache:
减少真正可以访问 origin 的 Edge 数量
+
提高 Upper Tier HIT 概率
+
由更适合 origin 的 Upper Tier 负责真正回源第二层:
让 Production 自动化能够容忍不可避免的瞬态错误。
bounded retry:
短暂失败
→ 有限次数重试
→ 恢复则继续
→ 耗尽仍然 fail closed前者能够真正改善网站用户面对 cold MISS 时的体验。
后者主要提高我自己的部署与验收成功率。
两者不能互相替代。
为什么我没有继续无限增加 timeout?
理论上还有一种最简单的解决办法:
25 秒不够
→ 改成 60 秒
5 次 retry 不够
→ 改成 10 次总有机会成功。
但这种做法我现在越来越不喜欢。
如果真正的问题是:
CDN 配错
源站挂了
证书错误
Nginx 异常
release 错误等得更久并不会增加可靠性。
只会让真正的故障更晚暴露。
所以当前原则仍然是:
bounded timeout
+
bounded retry
+
fail closed瞬态错误可以吸收。
确定性错误不能靠不停重试蒙过去。
为什么最终没有迁服务器,也没有换 CDN?
回过头看,这次其实是一次很典型的工程取舍。
我原本已经在考虑:
A. 把源服务器迁到海外 zgocloud
B. 非中文语言站全部从 Cloudflare 切回 EdgeOne这两个方案并不是错误方案。
在某些情况下,它们甚至可能才是最终解。
但是对我目前这个项目来说:
迁移海外 origin 改动太大,还涉及我没有完全确认清楚的备案与接入问题;
全部切回 EdgeOne,则意味着放弃当前 Cloudflare Free 的成本优势,随着语言数量增加,长期 CDN 开销也会继续增加。
相比之下:
继续保留当前架构
+
开启 Smart Tiered Cache几乎没有改变我的 Production 基线。
而真实结果已经明显改善了最困扰我的 cold MISS。
所以至少在当前阶段,我没有必要为了这个问题立刻做更大的架构迁移。
这个问题为什么特别容易被日常监控忽略?
我觉得这次最值得记录的,不只是 Smart Tiered Cache 这个开关。
而是:
CDN 会让源站网络问题变得非常不明显。
假设网站绝大多数请求都是:
HIT日常看到的可能一直是:
HTTP 200
很快
很稳定但真正影响:
发布之后
缓存 purge 之后
新 URL 第一次访问
冷门资源第一次访问
缓存自然失效之后的是 MISS。
所以现在如果我要判断一个 CDN 架构是否真的稳定,不会只测试:
已经 HIT 的首页还会专门观察:
fresh MISS因为二者测试的根本不是完全相同的东西。
HIT 更多是在测试:
Cloudflare Edge 提供已有缓存的能力MISS 才真正可能暴露:
Cloudflare 整个缓存层级
+
Cloudflare 到我的真实 origin发生了什么。
从“两层”变成“三层”,反而让我重新理解网络优化
以前我很自然会觉得:
用户 → Edge → Origin一定比:
用户 → Lower Tier → Upper Tier → Origin更直接,所以应该更快。
这次之后我越来越觉得:
这种理解太简单了。
网络性能真正重要的不是:
一共经过几个节点而是:
每一段路径质量如何
最差的路径在哪里
能不能避免真正走到最差路径如果新增的那一跳主要发生在 Cloudflare 自己网络内部,却换掉了一个质量不稳定的:
任意 Edge → 阿里云杭州那么多一跳完全可能反而更快。
而且如果 Upper Tier 已经 HIT:
Origin 请求甚至直接消失这才是 Tiered Cache 真正有意思的地方。
最后:Lower Tier MISS,不代表源站一定被访问
如果要从这次排障中留下两句话,我现在会选择:
Cloudflare HIT 很快,并不代表 Cloudflare 回源同样稳定。
以及:
开启 Tiered Cache 后,Lower Tier MISS 已经不再等于 Origin MISS。
我的实际过程大概是:
Cloudflare HIT:
平时看起来完全正常
cold MISS:
曾出现约 21.8 秒才成功
不断增加 retry:
提高了自己的 Production 成功率
但无法真正改善网站用户体验
考虑迁海外 origin:
改动大,还有备案/接入问题需要确认
考虑全部切 EdgeOne:
技术可行,但长期成本更高
最终:
继续使用 Cloudflare Free
开启 Smart Tiered Cache开启之后:
此前出问题的 Angular partial fresh MISS
→ 10/10 HTTP 200
→ 单次约 0.3~0.4 秒而 Tiered Cache 带来的变化不只是:
减少直接回源的 Edge 数量还包括:
Lower Tier MISS
→ Upper Tier HIT
→ 用户仍可看到 HIT
→ Origin 根本不参与以及:
Lower Tier MISS
→ Upper Tier MISS
→ 由 Smart Tiered Cache 选择的 Upper Tier
→ 真正访问阿里云杭州当然,它依然不会让 Internet 永远没有故障。
真实 Production 中仍然偶尔会看到:
curl exit 28
→ bounded retry
→ recovered所以我最终保留的是三层思路:
Smart Tiered Cache
改善回源架构
bounded retry
吸收短暂公网波动
fail closed
保证真正错误不会被自动化掩盖对于我目前这个“Cloudflare Free + 中国大陆阿里云杭州源站”的多语言项目来说,这已经是一次改动很小、成本几乎不变,但实际效果非常明显的优化。
A Tour of Go 多语言翻译项目
本系列完整记录 A Tour of Go 多语言翻译项目从架构设计、整页翻译、结构保护、自动校验,到生产发布与后续维护的实际开发过程。
项目入口:
✅ Brazilian Portuguese — Português (Brasil)
✅ Dutch — Nederlands
✅ French — Français
✅ German — Deutsch
✅ Italian — Italiano
✅ Japanese — 日本語
✅ Korean — 한국어
✅ Simplified Chinese — 简体中文
✅ Spanish — Español
✅ Turkish — Türkçe
✅ 项目源码:GitHub:shuijingwan/go-tour-i18n
项目正在持续扩展更多语言版本,并长期维护翻译质量、生产发布与后续更新。项目属于非官方社区多语言翻译项目,与 Go 官方无隶属或授权关系。

