Skip to content
返回云服务

Cloudflare Durable Objects 有状态协调

单实例有状态对象,强一致,适合实时房间、计数器和协调。

Cloudflare高级

为什么

Durable Objects 按 ID 提供强一致单实例 — Workers 上做实时房间、限流器和分布式锁的唯一方式。存储是事务 SQLite,无需外部 DB。

Cloudflare 网络覆盖 125+ 国家的 330+ 城市,服务 20% 的互联网流量。Workers 冷启动为 0ms(基于 isolate),免费套餐覆盖每天 10 万请求。

何时使用

用于 WebSocket 房间、按用户限流、分布式锁和任何「恰好一个」协调。避免高扇出(用 Queues)或简单 CRUD(用 D1)。

如何做

1. 定义类 — export class Room implements DurableObject { async fetch(request) {...} } 2. 绑定 — [[durable_objects.bindings]] name="ROOM" class_name="Room" 3. 迁移 — [[durable_objects.migrations]] new_sqlite_classes=["Room"] 4. 获取实例 — const id = env.ROOM.idFromName("room-42"); const stub = env.ROOM.get(id) 5. 状态 — this.ctx.storage.put("count", 1); const c = await this.ctx.storage.get("count") 6. WebSocket — 服务端 accept,存 this.ctx.getWebSockets(),消息时广播 7. 闹钟 — this.ctx.storage.setAlarm(Date.now() + 60000) 定时唤醒

示例

export class ChatRoom implements DurableObject { async fetch(request: Request): Promise<Response> { const pair = new WebSocketPair(); const [client, server] = Object.values(pair); this.ctx.acceptWebSocket(server); return new Response(null, { status: 101, webSocket: client }); } async webSocketMessage(ws: WebSocket, msg: string) { const count = (await this.ctx.storage.get<number>("count") || 0) + 1; await this.ctx.storage.put("count", count); for (const peer of this.ctx.getWebSockets()) peer.send(`count=${count}`); } } // Worker 按房间名路由到 DO(每房间单实例) export default { async fetch(request: Request, env: Env) { const id = env.ROOM.idFromName("general"); return env.ROOM.get(id).fetch(request); }, };

常见问题

  • ⚠单实例瓶颈 — 一个 DO 处理其 ID 所有请求,热 ID 限流
  • ⚠迁移类重名中断 — 旧 ID 孤立,用 old_class_names 迁移
  • ⚠WebSocket 内存限制 — 每消息 1MB,大广播需分块

最佳实践

  • ✓用可休眠 WebSocket — ctx.acceptWebSocket,消息间释放内存,更便宜
  • ✓分片热键 — room-42-shard0..N 跨 DO 分散负载
  • ✓用闹钟而非 setInterval — DO 可休眠,闹钟可靠唤醒

常见问题解答

什么是Cloudflare Durable Objects 有状态协调?它解决什么问题?

单实例有状态对象,强一致,适合实时房间、计数器和协调。 它可帮助开发者在不自建基础设施的前提下完成部署、存储与扩展,是云服务选型的核心参考。

如何在 5 分钟内上手Cloudflare Durable Objects 有状态协调?

两步即可跑通:① 定义类 — export class Room implements DurableObject { async fetch(request) {...} };② 绑定 — [[durable_objects.bindings]] name="ROOM" class_name="Room"。建议先用免费套餐验证流程,再接入生产环境。

Cloudflare Durable Objects 有状态协调 最容易踩的坑是什么?

最高频的问题是:单实例瓶颈 — 一个 DO 处理其 ID 所有请求,热 ID 限流。建议在上线前用 checklist 逐项核对,并在 CI 中加入策略与配置扫描。

Cloudflare Durable Objects 有状态协调 的最佳实践有哪些?

Cloudflare Durable Objects 有状态协调 的最佳实践包括:用可休眠 WebSocket — ctx.acceptWebSocket,消息间释放内存,更便宜;分片热键 — room-42-shard0..N 跨 DO 分散负载;用闹钟而非 setInterval — DO 可休眠,闹钟可靠唤醒。其中首条「用可休眠 WebSocket — ctx.acceptWebSocket,消息间释放内存,更便宜」应作为团队默认规范写入 IaC 模板。

Cloudflare Durable Objects 有状态协调 如何控制成本与避免账单意外?

三招防超支:① 为所有资源打 env/team 标签并启用账单告警;② 用预算阈值触发 Slack/邮件通知;③ 定期用 Cost Explorer 审查闲置资源并清理。Cloudflare Durable Objects 有状态协调 多数提供免费套餐,先在免费额度内验证再放量。