跳到主要内容
哒哒星球DADA PLANET

Skill · 已公开版本

durable-objects · 把持久状态和并发协调放进 Durable Objects

实现或审查 RPC、SQLite、闹钟与 WebSocket 等有状态 Worker 功能。

先看看示例

作者提供的示例,实际效果取决于你的输入和使用工具。

输入

每个 roomId 维护一个计数器;同房间用户看到相同计数;不同房间隔离;外层 Worker 已做房间访问检查。

输出

编辑示例 · 未运行

// Worker 中在完成身份与房间权限验证后获取同房间对象
const stub = env.COUNTERS.getByName(roomId);
const value = await stub.increment();

接口约定:increment() 在对象内读取并持久化新计数,再返回结果。
验证用例:同一房间并发 10 次增加应只增加 10;另一房间不变;对象重启后值保留。
若客户端会自动重试,还需 requestId 去重,避免重复加数。

方法说明

实现或审查 RPC、SQLite、闹钟与 WebSocket 等有状态 Worker 功能。

具体任务

为房间计数器定义对象边界:实现或审查 RPC、SQLite、闹钟与 WebSocket 等有状态 Worker 功能。

设计长连接协作状态:按房间组织对象、存储和客户端广播,检查休眠、断线重连与权限。

必需材料

Worker 代码与绑定配置

状态分组键和并发一致性需求

可选材料

存储与恢复要求

重复请求样例

使用门槛

已确定对象边界,了解身份验证必须发生在可信服务路径。

这个 Skill 额外提供的方法

按实体集中状态与协调,检查并发、重试与重启后的行为,而不只验证一次调用。

编辑示例(未运行)

为房间计数器定义对象边界

任务:请根据下面的示例材料完成为房间计数器定义对象边界,把判断依据和待确认事项写清楚。

输入:
每个 roomId 维护一个计数器;同房间用户看到相同计数;不同房间隔离;外层 Worker 已做房间访问检查。

结果片段:
```typescript
// Worker 中在完成身份与房间权限验证后获取同房间对象
const stub = env.COUNTERS.getByName(roomId);
const value = await stub.increment();
```

接口约定:increment() 在对象内读取并持久化新计数,再返回结果。
验证用例:同一房间并发 10 次增加应只增加 10;另一房间不变;对象重启后值保留。
若客户端会自动重试,还需 requestId 去重,避免重复加数。

按实体集中状态与协调,检查并发、重试与重启后的行为,而不只验证一次调用。 该片段是编辑示例,用于说明交付形态,未运行上游技能。

首次任务

请使用「把持久状态和并发协调放进 Durable Objects」完成「为房间计数器定义对象边界」。
任务要求:按实体集中状态与协调,检查并发、重试与重启后的行为,而不只验证一次调用。

我的必需材料:
- Worker 代码与绑定配置:[请填写或粘贴]
- 状态分组键和并发一致性需求:[请填写或粘贴]

请基于上述实际材料输出:预期获得对象接口、存储和调用实现,以及针对并发、重复请求和重启后行为的验证安排。验收要看状态归属是否正确,多个客户端是否可能产生冲突,不能只用一次成功调用证明协调逻辑可靠。缺少依据的地方单列为待确认,不编造事实;未执行的操作或测试明确标为未执行。

验收要求:
1. 状态键与实际业务隔离边界一致。
2. 并发与重试不会丢失或重复更新。
3. 重启后状态和迁移行为经过测试。

验收方法

状态键与实际业务隔离边界一致

并发与重试不会丢失或重复更新

重启后状态和迁移行为经过测试

依赖与准备

需要 Cloudflare Workers、Durable Objects 绑定与兼容 Wrangler 环境;具体 API 按当前官方文档核对,部署需账号、资源权限和费用范围。

使用边界

对象 ID 或房间名不构成授权,必须核验调用者访问权。

生产部署、迁移和数据删除需单独授权,持久化方案应有恢复验证。

排错

不同用户看到混乱状态:检查对象命名是否稳定且包含正确租户或房间边界。

请求重试导致重复扣减或计数:引入幂等键与持久记录,测试重复请求路径。

固定来源

https://github.com/cloudflare/skills/blob/6dc7604903127485e7e4cb26314651ebd4a4df19/skills/durable-objects/SKILL.md