工程 · 2 min read
五個零件串成一個迴圈
五個零件串成一個迴圈:CDN 副本過期、沒有 bypass 規則、stale-while-revalidate、HEAD 拿到 405,最後 edge 只能保留副本 1 秒。
走 proxy 路線的大檔案,每個 request 都會重跑這個迴圈。實測中主要是大型 HTML。
前面每一篇都只是一個零件。把它們接起來,就是 HTML 一直跑回 origin 的原因(症狀:HTML、CSS、JS 一直跑回 origin)。
- Akamai 的副本過期,所以去問下一層(Cache 的新鮮度:fresh、stale 和 304)。
- Proxy 路線沒有 bypass 規則,所以 LB cache 接下 request(Bypass header 只在有規則的地方有效)。
- LB cache 立刻用舊副本回 304(Stale-while-revalidate:先回舊檔,背景再刷新)。
- LB cache 在背景用 HEAD refresh。第 3 步和第 4 步同時發生。
- Proxy 只接受 GET,所以回 405(Proxy 不接受 HEAD,刷新永遠失敗)。副本維持過期。
- 副本到 Akamai 時已經過期,所以 Akamai 只保留 1 秒。
| 步驟 | 證據 | 類型 |
|---|---|---|
| 1、6 | Akamai debug header 三次都是 TCP_REFRESH_HIT 和 max-age=1 | 事實 |
| 4、5 | 7 個 request 對應 proxy log 同一秒的 7 行 HEAD 405 | 事實 |
| 3 | 304 帶的 Age 超過 3600 | 推論,我從台灣看不到美國的 LB cache |
迴圈存在時,curl 的輸出會有 max-age=1 和 TCP_REFRESH_HIT。同一個檔案改從不走 proxy 的舊網域 fetch,TTL 正常,之後都是 cache hit。
每個零件單獨看都合理。接在一起,就成了一個停不下來的迴圈。
延伸閱讀:症狀:HTML、CSS、JS 一直跑回 origin、Bypass header 只在有規則的地方有效、Stale-while-revalidate:先回舊檔,背景再刷新、Proxy 不接受 HEAD,刷新永遠失敗、我學到的:cache 不是一個方塊,是一條鏈。或回到系列總覽。