durable-objects

作者: Cloudflare

创建和审查Cloudflare Durable Objects。用于构建有状态协调(聊天室、多玩家游戏、预订系统)、实现RPC方法、SQLite存储、警报、WebSocket,或审查DO代码以遵循最佳实践。涵盖Workers集成、wrangler配置以及使用Vitest进行测试。

npx skills add https://github.com/cloudflare/skills --skill durable-objects

Durable Objects

Build stateful, coordinated applications on Cloudflare's edge using Durable Objects.

Retrieval Sources

Your knowledge of Durable Objects APIs and configuration may be outdated. Prefer retrieval over pre-training for any Durable Objects task.

ResourceURL
Docshttps://developers.cloudflare.com/durable-objects/index.md
API Referencehttps://developers.cloudflare.com/durable-objects/api/index.md
Best Practiceshttps://developers.cloudflare.com/durable-objects/best-practices/index.md
Exampleshttps://developers.cloudflare.com/durable-objects/examples/index.md
Roles and permissionshttps://developers.cloudflare.com/workers/authorization/durable-objects/index.md

Fetch the relevant doc page when implementing features.

When to Use

  • Creating new Durable Object classes for stateful coordination
  • Implementing RPC methods, alarms, or WebSocket handlers
  • Reviewing existing DO code for best practices
  • Configuring wrangler.jsonc/toml for DO bindings and migrations
  • Writing tests with Cloudflare’s Vitest integration
  • Designing sharding strategies and parent-child relationships

Reference Documentation

  • ./references/rules.md - Core rules, storage, concurrency, RPC, alarms
  • Testing reference - Current Vitest documentation, migration choices, and test selection
  • Workers reference - Workers handlers, types, configuration, tracing, and local debugging

Search: blockConcurrencyWhile, idFromName, getByName, setAlarm, sql.exec

Core Principles

Use Durable Objects For

NeedExample
CoordinationChat rooms, multiplayer games, collaborative docs
Strong consistencyInventory, booking systems, turn-based games
Per-entity storageMulti-tenant SaaS, per-user data
Persistent connectionsWebSockets, real-time notifications
Scheduled work per entitySubscription renewals, game timeouts

Do NOT Use For

  • Stateless request handling (use plain Workers)
  • Maximum global distribution needs
  • High fan-out independent requests

Quick Reference

Wrangler Configuration

// wrangler.jsonc
{
  "durable_objects": {
    "bindings": [{ "name": "MY_DO", "class_name": "MyDurableObject" }]
  },
  "migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyDurableObject"] }]
}

Basic Durable Object Pattern

import { DurableObject } from "cloudflare:workers";

export interface Env {
  MY_DO: DurableObjectNamespace<MyDurableObject>;
}

export class MyDurableObject extends DurableObject<Env> {
  constructor(ctx: DurableObjectState, env: Env) {
    super(ctx, env);
    ctx.blockConcurrencyWhile(async () => {
      this.ctx.storage.sql.exec(`
        CREATE TABLE IF NOT EXISTS items (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          data TEXT NOT NULL
        )
      `);
    });
  }

  async addItem(data: string): Promise<number> {
    const result = this.ctx.storage.sql.exec<{ id: number }>(
      "INSERT INTO items (data) VALUES (?) RETURNING id",
      data
    );
    return result.one().id;
  }
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const stub = env.MY_DO.getByName("my-instance");
    const id = await stub.addItem("hello");
    return Response.json({ id });
  },
};

Critical Rules

  1. Model around coordination atoms - One DO per chat room/game/user, not one global DO
  2. Use getByName() for deterministic routing - Same input = same DO instance
  3. Use SQLite storage - Configure new_sqlite_classes in migrations
  4. Initialize in constructor - Use blockConcurrencyWhile() for schema setup only
  5. Use RPC methods - Not fetch() handler (compatibility date >= 2024-04-03)
  6. Persist first, cache second - Always write to storage before updating in-memory state
  7. One alarm per DO - setAlarm() replaces any existing alarm

Authorization

Durable Objects do not have separate roles or permissions; access follows the Worker that implements them. Retrieve the current Durable Objects authorization guidance before granting observability or Data Studio access, and scope the Workers role to the intended Worker or Workers product.

Anti-Patterns (NEVER)

  • Single global DO handling all requests (bottleneck)
  • Using blockConcurrencyWhile() on every request (kills throughput)
  • Storing critical state only in memory (lost on eviction/crash)
  • Using await between related storage writes (breaks atomicity)
  • Holding blockConcurrencyWhile() across fetch() or external I/O

Stub Creation

// Deterministic - preferred for most cases
const stub = env.MY_DO.getByName("room-123");

// From existing ID string
const id = env.MY_DO.idFromString(storedIdString);
const stub = env.MY_DO.get(id);

// New unique ID - store mapping externally
const id = env.MY_DO.newUniqueId();
const stub = env.MY_DO.get(id);

Storage Operations

// SQL (synchronous, recommended)
this.ctx.storage.sql.exec("INSERT INTO t (c) VALUES (?)", value);
const rows = this.ctx.storage.sql.exec<Row>("SELECT * FROM t").toArray();

// KV (async)
await this.ctx.storage.put("key", value);
const val = await this.ctx.storage.get<Type>("key");

Alarms

// Schedule (replaces existing)
await this.ctx.storage.setAlarm(Date.now() + 60_000);

// Handler
async alarm(): Promise<void> {
  // Process scheduled work
  // Optionally reschedule: await this.ctx.storage.setAlarm(...)
}

// Cancel
await this.ctx.storage.deleteAlarm();

Testing

Read the testing reference before configuring a suite or writing Durable Object tests. It routes to current setup, APIs, and examples and identifies the behavior to cover.

Skill feedback

If the user reports that this skill gave incorrect or outdated guidance, or is missing information, read references/skill-feedback.md.

来自 Cloudflare 的更多技能

agents-sdk
Cloudflare
在Cloudflare Workers上使用Agents SDK构建AI代理。创建有状态代理、持久化工作流、实时WebSocket应用、定时任务、MCP服务器或聊天应用时加载。涵盖Agent类、状态管理、可调用RPC、Workflows集成及React钩子。
building-ai-agent-on-cloudflare
Cloudflare
基于Cloudflare构建AI智能体,使用Agents SDK实现状态管理、实时WebSocket、定时任务、工具集成及聊天功能。生成可直接部署到Workers的生产级智能体代码。 适用场景:用户需要“构建智能体”、“AI智能体”、“聊天智能体”、“有状态智能体”,提及“Agents SDK”,需要“实时AI”、“WebSocket AI”,或询问智能体“状态管理”、“定时任务”、“工具调用”。
development
building-mcp-server-on-cloudflare
Cloudflare
在 Cloudflare Workers 上构建远程 MCP(模型上下文协议)服务器,支持工具、OAuth 认证和生产部署。生成服务器代码、配置认证提供者并部署到 Workers。 使用场景:用户想要“构建 MCP 服务器”、“创建 MCP 工具”、“远程 MCP”、“部署 MCP”、添加“MCP 的 OAuth”,或提及 Cloudflare 上的模型上下文协议。也会在“MCP 认证”或“MCP 部署”时触发。
development
cloudflare
Cloudflare
全面的Cloudflare平台技能,涵盖Workers、Pages、存储(KV、D1、R2)、AI(Workers AI、Vectorize、Agents SDK)、网络(Tunnel、Spectrum)、安全(WAF、DDoS)以及基础设施即代码(Terraform、Pulumi)。适用于任何Cloudflare开发任务。
sandbox-sdk
Cloudflare
构建沙盒化应用程序以实现安全代码执行。在构建AI代码执行、代码解释器、CI/CD系统、交互式开发环境或执行不受信任的代码时加载。涵盖Sandbox SDK生命周期、命令、文件、代码解释器和预览URL。
web-perf
Cloudflare
使用Chrome DevTools MCP分析网页性能。测量核心网页指标(FCP、LCP、TBT、CLS、速度指数),识别渲染阻塞资源、网络依赖链、布局偏移、缓存问题及可访问性差距。当被要求审计、分析、调试或优化页面加载性能、Lighthouse评分或网站速度时使用。
workers-best-practices
Cloudflare
审查并根据生产最佳实践对Cloudflare Workers代码进行审核。在编写新的Workers、审查Worker代码、配置wrangler.jsonc或检查常见的Workers反模式(流式处理、浮动Promise、全局状态、机密、绑定、可观测性)时加载。倾向于从Cloudflare文档中检索信息,而非依赖预训练知识。
wrangler
Cloudflare
Cloudflare Workers CLI,用于部署、开发和管理 Workers、KV、R2、D1、Vectorize、Hyperdrive、Workers AI、Containers、Queues、Workflows、Pipelines 及 Secrets Store。在运行 wrangler 命令前加载,以确保正确的语法和最佳实践。