~/VibeHandbook
免費 PDF

Cloudflare

developers.cloudflare.com

Durable Objects

它是什麼

想像一位前臺接待員,一次只接待一個人,並且記得之前來過的每一個人——不會有第二位接待員給出相互矛盾的答覆。Durable Object 就是軟體裡的那位接待員:一個微小的、保有自己記憶(即"有狀態")的伺服器,Cloudflare 保證它在任一時刻恰好只存在於一個地方。每個物件都有唯一的 ID、自己的持久化儲存,並逐個處理請求,因此它天然適合做協調工作——計數器、鎖、遊戲房間、聊天會話。Worker 在兩次請求之間會忘掉一切(即"無狀態")、到處執行,而 Durable Object 會記住,並且是單一的。

優勢

  • 單例項保證——跨副本不存在競態條件。
  • 內建的持久化儲存(現由 SQLite 支撐),與物件同處一地。
  • 非常適合即時應用:WebSockets(一條保持開啟的雙向即時連線,使伺服器能即時推送更新)、線上狀態(presence)、即時協作。
  • 強一致性:物件內部的寫後讀是即時可見的。
  • 鬧鐘(Alarms)讓物件能為自己安排未來的工作。

取捨

  • 每個物件單執行緒——一個熱點物件可能成為瓶頸;要按鍵分片。
  • 比純 Worker 需要考慮的更多;物件邊界要由你來設計。
  • 每個物件的儲存是有上限的;在規模上無法替代 D1( 資料庫)或 R2(檔案儲存)。
  • 對於無狀態的請求處理則是殺雞用牛刀。

何時使用

當你需要協調或按實體儲存狀態時,就動用 Durable Objects:聊天室、多人遊戲狀態、限流器、領導者選舉,或一份多客戶端同時編輯的即時文件。

Vibe coding 契合度

Durable Objects 在那些原本難以搭建的即時功能上大放異彩,agent 可以為你搭好類、繫結以及 WebSocket 處理。告訴它如何分片——通常是每個房間、使用者或文件一個物件——這樣單個物件就不會把你所有的流量序列化。下面的配置聲明瞭一個帶遷移的 Durable Object 類。

# wrangler.toml
[[durable_objects.bindings]]
name = "ROOM"
class_name = "ChatRoom"

[[migrations]]
tag = "v1"
new_sqlite_classes = ["ChatRoom"]
npx wrangler deploy