78 毫秒的奇蹟:Cloudflare D1 全球讀取複製實測數據

你有沒有遇過這種情況:本機測試 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
2
3
4
const bookmark = request.headers.get('x-d1-bookmark') ?? 'first-unconstrained'
const session = env.DB.withSession(bookmark)
const { results } = await session.prepare('SELECT * FROM users WHERE id = ?').bind(userId).all()
response.headers.set('x-d1-bookmark', session.getBookmark())

這個 bookmark 是 D1 的一致性機制的核心。每次讀取後,session 會返回一個 bookmark 代表「你上次讀到的狀態」。下次請求帶著這個 bookmark,D1 就知道要把你路由到一個至少包含這個狀態的副本——避免你寫入後立刻讀取卻看不到自己的寫入(幽靈讀)。

Sequential Consistency:比你想像的更強

很多分散式資料庫提供的是 Eventual Consistency(最終一致性):寫進去了,但你不知道什麼時候能讀到,也不保證你自己馬上讀得到。

D1 Read Replication 提供的是 Sequential Consistency(循序一致性),保證兩件事:

  1. Read-your-own-writes:你剛寫進去的,你自己一定讀得到
  2. Writes-follow-reads:你在某個狀態下讀了資料,之後的寫入一定基於這個狀態之後

Bookmark 機制讓這個保證可以跨越多個 HTTP 請求維持——只要你的 client 把 bookmark 帶著,D1 就會保持一致性視圖。這比純 eventual consistency 強得多,對用戶體驗的意義是:不會有「我明明剛存了,怎麼沒了」的迷惑瞬間。

免費,且現在就能用

這功能目前對所有 D1 用戶免費,不需要額外費用。啟用方式是在 wrangler.toml 加上:

1
2
3
4
5
[[d1_databases]]
binding = "DB"
database_name = "your-db"
database_id = "xxx"
read_replication = { mode = "auto" }

加上前面提到的 Sessions API 改寫,大概一兩個小時的工作量,卻可能讓遠端用戶的體驗有質的飛躍。

一個還沒有答案的問題

澳洲的 95.7% 是有實測數字的。但台灣的 APAC 副本實際效果如何,目前沒有可信賴的公開實測數據。

如果你手邊有跑在 Cloudflare Workers 上的 D1 應用,其實很容易寫一個簡單的延遲測試腳本:在 Primary 區域寫一筆,立刻從台灣讀,看 confirm lag 實際落在哪裡。這個數字,也許比估算值更有說服力。

地理距離是你改變不了的常數,但 Cloudflare 的副本拓撲可以讓你繞過它。這或許是 edge computing 最務實的一個落地場景。


一見生財 · 2026-03-07

📡 想看更多?加入 AI 印鈔指南 頻道,每日推送 AI 技術前沿 + 加密貨幣投資情報

留言

載入留言中...

留下你的想法