Cloudflare D1 全球讀取副本:那些官方沒說清楚的延遲數字

你有沒有遇過這種情況:文件上寫著「全球分散式」,你興沖沖地部署上去,結果用戶跟你說「為什麼我剛存的資料消失了」?

我最近在研究 Cloudflare D1 的 Global Read Replication,試圖搞清楚它的延遲到底是多少,以及它的「一致性保證」是否值得信任。官方文件說得很美,但真正能讓你做出部署決策的數字,藏在 changelog、社群討論和 benchmark 工具裡——不是首頁。

先把數字擺出來

研究完之後,我整理出這張表:

場景 延遲
就近副本讀取 5–20ms
跨洲主庫讀取 50–200ms
ENAM → WNAM confirm lag 30–45ms
跨大西洋 confirm lag 55–75ms
Worker API 請求整體改善 40–60% 降低

這裡面有幾個細節值得說清楚。

就近副本讀取的 5–20ms 是在命中本地副本的情況下——也就是你的 Worker 和副本在同一個 Cloudflare 數據中心區域。這個速度其實不錯,接近本地 SQLite 的感覺。

跨洲主庫讀取的 50–200ms 則是反例:如果你的讀取因為某些原因被路由到了主庫(Primary),而主庫在地球另一端,延遲就會飆上去。這不是副本的問題,而是副本「沒辦法回答你的問題」的情況。

Confirm lag 這個概念很關鍵,我後面會細說。

什麼是 Confirm Lag,為什麼你應該在乎

D1 的全球讀取副本不是用「最終一致性」(Eventual Consistency)設計的。這是我覺得最有意思的地方。

大部分分散式資料庫為了效能,會選擇最終一致性:寫入主庫之後,副本「終究」會同步上來,但不保證什麼時候。這讓「讀自己剛寫的資料」(read your own writes)變成一個不確定的事情。你剛存了一筆訂單,立刻查詢,有可能查不到——因為副本還沒同步。

D1 選了不同的路:Sequential Consistency,用的機制叫做 Bookmark,本質上是一個 Lamport timestamp。

運作方式大概是這樣:當你做了一次寫入,D1 會給你一個 Bookmark 值。下次讀取的時候,你可以帶著這個 Bookmark 告訴 D1:「我要讀的資料,至少要包含這個時間點之後的狀態。」D1 會確保副本的狀態達到這個時間點,再回傳給你。

這就是 Confirm Lag 的由來——副本要「確認」自己已經同步到那個 Bookmark 所代表的狀態,才能服務這次讀取。ENAM 到 WNAM(東岸到西岸)的確認延遲大約是 30–45ms,跨大西洋則是 55–75ms。

這個設計讓 “read your own writes” 有了保障,代價是部分讀取請求需要等副本確認同步。對大多數應用場景來說,這個取捨是值得的——用戶體驗上,「我剛存的東西消失了」遠比「這次查詢多等了 40ms」更難接受。

實際部署的考量

了解了這些數字之後,幾個問題就有答案了:

什麼情況適合 D1 Global Read Replication?

如果你的應用讀多寫少,而且讀取大部分是不需要最新狀態的歷史資料(例如文章列表、商品目錄),就近副本的 5–20ms 讀取速度相當誘人。結合 Cloudflare Workers 的邊緣運算,可以做到很低的端到端延遲。

什麼情況要小心?

高頻寫入 + 立即讀取的場景。每次寫入之後的讀取都需要帶 Bookmark 等待確認,如果你的業務邏輯是「存完馬上查」,confirm lag 會累積。跨洲的情況下,每次這樣的操作多等 30–75ms,對某些實時性要求高的應用可能是個問題。

APAC 的情況?

這裡有個資訊缺口:Cloudflare 官方目前沒有公佈 APAC 區域的延遲數字。如果你的用戶主要在台灣、日本、東南亞,需要自己去測。Cloudflare 有一個互動式 benchmark 工具 replicas.pages.dev,可以從你的位置實際測試讀取延遲,這比看文件上的數字更可靠。

一致性模型值得多想一下

Sequential Consistency 和 Eventual Consistency 的差別,不只是技術細節,而是影響你整個應用的狀態管理方式。

最終一致性的世界裡,你需要在應用層面處理「資料可能不是最新的」這件事——顯示「最後更新時間」、加上版本號、或者接受偶爾的資料不一致。

Sequential Consistency 的世界裡,你可以假設讀到的資料是連貫的,但需要理解 Bookmark 機制,並且在設計 API 時考慮到 confirm lag 的存在。

兩種方式都有它的位置,但混淆它們的後果通常很慘。D1 選擇 Sequential Consistency 其實是一個相對保守、對開發者友好的選擇——代價由基礎設施承擔,而不是讓應用開發者自己處理一致性邊界情況。

還沒搞清楚的事

說了這麼多,我還有一個疑問沒有答案:在 Bookmark 確認等待期間,D1 是阻塞整個讀取請求,還是有某種回退機制?官方文件沒有說得很清楚。如果是純阻塞等待,極端情況下(網路波動、副本落後)的 P99 延遲可能比表中的數字高很多。

這也許是值得用 replicas.pages.dev 壓測一下的問題。如果有人做過,很想知道結果。


一見生財,2026-03-08

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

留言

載入留言中...

留下你的想法