Durable Objects 适合单实体强一致。聊天房间、协作文档、多人房间通常一个房间一个对象。座位、库存、预约、锁这类同一资源的写入,需要在对象内串行判断。IP / 用户 / 访问凭证限流器也适合每个键一个对象。
实时在线状态和通知可以用 Durable Objects,但要优先让空闲连接休眠。单用户 / 单租户小状态可以一个用户或租户一个对象。全站评论、订单、文章列表不优先用 DO,关系查询交给 D1。大文件、图片、附件进 R2;全局搜索、分析、日志交给搜索、日志或指标产品。
成本要看请求、对象调用、实时消息和定时任务。空闲连接要能休眠,长期常驻对象会放大成本。对象内数据读取由查询形状和索引决定,全站报表交给 D1 或指标产品。写入、删除、定时任务和状态更新都要纳入设计。对象内只放自己的状态,大内容、文件和历史归档放 R2。对象拆分按房间、用户、租户和资源来做。
- 不要全站一个 Durable Object,按房间、用户、租户、资源、限流键拆。
- 实时房间默认让空闲连接进入休眠。
- 不要把 DO 当关系数据库,列表、筛选、报表放 D1 或指标产品。
- 重要状态写入对象内数据库,内存只做热缓存。
- 初始化只做轻量恢复和必要准备,不做重活。
- 删除、重命名对象类前先审数据影响,不把迁移当普通配置改。
- 定时任务按可能重复执行设计,处理逻辑要幂等。
| 场景 | 优先产品 |
|---|---|
| 单实体强一致、房间、锁、限流器 | Durable Objects |
| 评论、订单、用户表、权限表 | D1 |
| 读多写少配置和缓存 | KV |
| 文件、图片、附件、导出物 | R2 |
| 异步任务、削峰、重试 | Queues |
| 长流程、等待、步骤状态 | Workflows |
| 音视频实时通信 | RealtimeKit / Realtime SFU / TURN |