你有沒有遇過這種情況:本機測試 API 回應是 80ms,一切正常;但用戶從澳洲或台灣連進來,同一支 endpoint 要等 1.8 秒?
這不是 bug,是地理。
我最近在研究 Cloudflare D1 的全球讀取複製功能,挖到了一份來自澳洲開發者的實測數據,數字讓我看了兩遍才相信——延遲從 1,800ms 降到 78ms,降幅 95.7%。不是調優、不是快取,是一個功能開關。
問題的根源:Primary 在倫敦,你在南半球
Cloudflare D1 預設把資料庫放在離第一次寫入最近的 Cloudflare 數據中心。如果你的主要流量在歐洲,Primary 就在倫敦沒什麼問題;但如果澳洲的用戶要查一筆資料,請求要飛到倫敦再飛回來,往返一趟光是網路延遲就吃掉了好幾百毫秒。
Jack Pearce 做了一個實測:Primary 在倫敦,從澳洲一台 VPS 發出單次 D1 query,平均要 1,800ms。完整 API 請求(多個 query)更是要 12.57 秒。這種延遲在生產環境裡,基本上等於服務不可用。
D1 Read Replication 做了什麼
Cloudflare 在 2024 年底推出了 D1 Global Read Replication。概念很簡單:在六個主要區域建立只讀副本,讀取請求打到最近的副本,寫入還是走 Primary。
六個副本區域:
- WNAM(美西)
- ENAM(美東)
- WEUR(西歐)
- EEUR(東歐)
- APAC(亞太,涵蓋台灣)
- OC(大洋洲)
開啟之後,同樣是澳洲那台 VPS,單次 query 降到 78ms,完整 API 請求降到 1.02 秒。這就是地理距離被解決之後的實際效果。
Confirm Lag:複製延遲是多少
讀取打副本很快,但寫入要多久才能同步到副本?這個延遲叫做 Confirm Lag,Cloudflare 官方 blog 有提供跨區實測數字:
| 路徑 | Confirm Lag |
|---|---|
| ENAM → WNAM | 45ms |
| ENAM → WEUR | 55ms |
| ENAM → EEUR | 67ms |
| WNAM → WEUR | 75ms |
台灣用戶透過 APAC 副本讀取的 confirm lag,官方沒有直接公布,根據地理距離估計大約在 80–120ms 之間。意思是:你在台灣寫入一筆資料後,大約 100ms 內台灣的副本就會更新。
對於絕大多數應用場景,這個延遲幾乎感覺不到。
關鍵細節:Sessions API
這裡有一個容易踩到的坑,也是讓很多人啟用 read replication 後發現「怎麼還是慢」的原因。
直接用 env.DB.prepare() 不會觸發副本讀取。 你必須改用 Sessions API:
1 | const bookmark = request.headers.get('x-d1-bookmark') ?? 'first-unconstrained' |
這個 bookmark 是 D1 的一致性機制的核心。每次讀取後,session 會返回一個 bookmark 代表「你上次讀到的狀態」。下次請求帶著這個 bookmark,D1 就知道要把你路由到一個至少包含這個狀態的副本——避免你寫入後立刻讀取卻看不到自己的寫入(幽靈讀)。
Sequential Consistency:比你想像的更強
很多分散式資料庫提供的是 Eventual Consistency(最終一致性):寫進去了,但你不知道什麼時候能讀到,也不保證你自己馬上讀得到。
D1 Read Replication 提供的是 Sequential Consistency(循序一致性),保證兩件事:
- Read-your-own-writes:你剛寫進去的,你自己一定讀得到
- Writes-follow-reads:你在某個狀態下讀了資料,之後的寫入一定基於這個狀態之後
Bookmark 機制讓這個保證可以跨越多個 HTTP 請求維持——只要你的 client 把 bookmark 帶著,D1 就會保持一致性視圖。這比純 eventual consistency 強得多,對用戶體驗的意義是:不會有「我明明剛存了,怎麼沒了」的迷惑瞬間。
免費,且現在就能用
這功能目前對所有 D1 用戶免費,不需要額外費用。啟用方式是在 wrangler.toml 加上:
1 | [[d1_databases]] |
加上前面提到的 Sessions API 改寫,大概一兩個小時的工作量,卻可能讓遠端用戶的體驗有質的飛躍。
一個還沒有答案的問題
澳洲的 95.7% 是有實測數字的。但台灣的 APAC 副本實際效果如何,目前沒有可信賴的公開實測數據。
如果你手邊有跑在 Cloudflare Workers 上的 D1 應用,其實很容易寫一個簡單的延遲測試腳本:在 Primary 區域寫一筆,立刻從台灣讀,看 confirm lag 實際落在哪裡。這個數字,也許比估算值更有說服力。
地理距離是你改變不了的常數,但 Cloudflare 的副本拓撲可以讓你繞過它。這或許是 edge computing 最務實的一個落地場景。
一見生財 · 2026-03-07
載入留言中...