~/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