~/VibeHandbook
$39

Cloudflare

developers.cloudflare.com

Durable Objects

概要

Durable Object は、Cloudflare が常にちょうど 1 か所だけに存在することを保証する、小さなステートフルなサーバーです。各オブジェクトは一意の ID、独自の永続ストレージを持ち、リクエストを一度に 1 つずつ処理するため、協調処理 — カウンター、ロック、ゲームルーム、チャットセッション — の自然な置き場所になります。Worker がステートレスで至るところで動くのに対し、Durable Object はステートフルで唯一無二です。

強み

  • 単一インスタンスの保証 — レプリカ間の競合状態がありません。
  • オブジェクトと同じ場所に配置された永続ストレージを標準搭載(現在は SQLite が基盤)。
  • リアルタイムアプリに最適 — WebSocket、プレゼンス、ライブコラボレーション。
  • 強い一貫性 — オブジェクト内では書き込み後の読み取りが即座に反映されます。
  • アラームにより、オブジェクトが自身の将来の作業をスケジュールできます。

トレードオフ

  • オブジェクトごとにシングルスレッド — ホットなオブジェクトはボトルネックになり得ます。キーでシャーディングしましょう。
  • 素の Worker より考慮すべきことが多く、オブジェクトの境界を設計する必要があります。
  • オブジェクトごとのストレージには上限があります。大規模では D1 や R2 の代替にはなりません。
  • ステートレスなリクエスト処理には過剰です。

使うべきとき

協調処理やエンティティごとの状態が必要なときに Durable Objects を使いましょう。チャットルーム、マルチプレイヤーのゲーム状態、レートリミッター、リーダー選出、あるいは多数のクライアントが同時に編集するライブドキュメントなど。

バイブコーディングとの相性

Durable Objects は、ほかの方法では作るのが面倒なリアルタイム機能で輝きます。エージェントはクラス、バインディング、WebSocket の処理を足場として組み立てられます。どうシャーディングするか — 通常はルーム、ユーザー、ドキュメントごとに 1 オブジェクト — を伝え、単一のオブジェクトがすべてのトラフィックを直列化しないようにしましょう。以下の設定は、マイグレーションを伴う Durable Object クラスを宣言しています。

# wrangler.toml
[[durable_objects.bindings]]
name = "ROOM"
class_name = "ChatRoom"

[[migrations]]
tag = "v1"
new_sqlite_classes = ["ChatRoom"]
npx wrangler deploy