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