Durable Object は、コンピュートとストレージを独自に組み合わせた特別な Cloudflare Worker です。Worker と同様に、最初にリクエストされた場所の近くに自動でプロビジョニングされ、必要なときにすばやく起動し、アイドル時には停止します。世界中に数百万個を持てます。ただし、通常の Workers とは次の点が異なります。
- 各 Durable Object には グローバルに一意な名前 があり、世界中のどこからでも特定のオブジェクトへリクエストを送れます。そのため、協調が必要な複数クライアント間の調整に使えます。
- 各 Durable Object には 耐久ストレージ が付属します。このストレージはオブジェクトと同じ場所にあるため、強い一貫性を保ちつつ、高速にアクセスできます。
そのため、Durable Objects では ステートフル なサーバーレスアプリケーションを実現できます。
Durable Objects には、分散されたステートフルでスケーラブルなアプリケーションに適した性質があります。
サーバーレスのコンピュート。インフラ管理は不要です
- Durable Objects は Workers ランタイムの上に構築されているため、同じコード(JavaScript と WASM)を使え、メモリと CPU の制限も似ています。
- 各 Durable Object は 初回アクセス時に暗黙的に作成されます。アプリケーションはライフサイクルや、作成・破棄を意識する必要はありません。Durable Objects は健全なサーバー間を移行するため、アプリケーション側で管理する必要はありません。
- 各 Durable Object はリクエストを処理しているあいだ生き続け、アイドルになってから数秒後にハイバネーションするまで残ります。そのため、連続する多数のリクエストを処理するあいだ インメモリキャッシュを活用 でき、性能を上げられます。
コンピュートと同じ場所にあるストレージ
- 各 Durable Object は、リクエストをまたいで永続し、そのオブジェクト内からのみアクセスできる 耐久性があり、トランザクション対応で、強い一貫性を持つストレージ(最大 10 GB1)を持ちます。
シングルスレッドの並行処理
- 各 Durable Object インスタンスには識別子 があり、ランダム生成またはユーザー指定です。これにより、特定の操作やリクエストをどの Durable Object が扱うかを、グローバルに指定できます。
- Durable Objects はシングルスレッドで、Web ブラウザー上のコードと同様に協調的にマルチタスクします。安全性と正しさの実現方法は、ブログ記事 "Durable Objects: Easy, Fast, Correct — Choose three" ↗ を参照してください。
Cloudflare のグローバルネットワーク全体での弾力性のある水平スケーリング
- Durable Objects は世界中に配置でき、各インスタンスの配置場所に任意で影響を与えられます。Durable Objects は、まだすべての Cloudflare データセンターで使えるわけではありません。稼働中のロケーションは where.durableobjects.live ↗ を参照してください。
- 各 Durable Object の種類(Cloudflare では "Namespace binding")は、実際のロジックを実装する JavaScript クラスに対応します。名前空間ごとに作成できる Durable Objects の数に、厳しい上限はありません。
- Durable Objects は、アプリケーションが数百万のオブジェクトを作るにつれて弾力的にスケールします。アプリケーションがインフラを管理したり、事前に容量を計画したりする必要はありません。
各 Durable Object は独自の インメモリ状態 を持ちます。アプリケーションは重要な情報をメモリ上に置くことで、耐久ストレージへアクセスせずに性能を最適化できます。
インメモリ状態が役立つ例には、ストレージへ永続化する前の情報のバッチ処理や集約、一定の条件を満たす受信リクエストの即時拒否や処理などがあります。
インメモリ状態は、Durable Object が一定時間アイドルになったあとのハイバネーションでリセットされます。そのため、あとから別のリクエストを受け取ったときに必要なデータは、耐久ストレージへ永続化してください。
Durable Object Storage API を使うと、Durable Objects は高速で、トランザクション対応で、強い一貫性を持つストレージにアクセスできます。Durable Object に付属するストレージはその一意なインスタンス専用で、ほかのオブジェクトからはアクセスできません。
Storage API には、キー値(KV)API と SQL API の 2 種類があります。
Durable Objects の新しい SQLite ストレージバックエンド を使う場合は、両方の API にアクセスできます。以前のストレージバックエンドでは、キー値 API だけを使えます。
Durable Objects は Alarms API を提供します。将来の時刻に Durable Object を起こすスケジュールを設定できます。定期的な処理や、特定の時点での処理を、ジョブスケジューラーなどのインフラを自分で管理せずに行いたい場合に便利です。
Alarms をインメモリ状態と耐久 Storage API と組み合わせると、キュー、ワークフロー、高度なデータパイプラインなどのバッチ処理や集約アプリケーションを構築できます。
WebSockets は、クライアントとサーバーの双方向リアルタイム通信を可能にする、長寿命の TCP 接続です。WebSocket セッションは長寿命なため、アプリケーションはクライアント側またはサーバー側の接続の受け口として Durable Objects をよく使います。
Durable Objects は Cloudflare Workers 間の調整点になるため、1 つの Durable Object インスタンスを WebSockets と並行して使い、チャットルームの参加者やマルチプレイヤーゲームなど、複数クライアント間を調整できます。
Durable Objects は WebSocket Standard API に加え、非アクティブ期間の課金を発生させずにコストを抑える WebSockets Hibernation API にも対応しています。後者は Web Standard WebSocket API を拡張したものです。
Durable Objects は Workers の Remote-Procedure-Call(RPC) に対応しており、Workers と Durable Objects のあいだを、JavaScript ネイティブのメソッドとオブジェクトで通信できます。
通信に RPC を使うと、アプリケーション開発が簡単になり、考え方も単純になり、効率も上がります。
Durable Objects を捉える別の視点が、Actor プログラミングモデル ↗ です。プログラミング言語レベルで Actor モデルを支えるランタイムやライブラリの例には、Erlang ↗、Elixir ↗、Akka ↗、.NET 向け Microsoft Orleans ↗ などがあります。
Actor モデルは、任意のトランスポートプロトコル上に実装できる RPC 呼び出し(またはメッセージ送信)でアクター間の通信を抽象化し、分散システムの多くの問題を単純にします。共有メモリによる並行処理で起きやすい、複数プロセスやスレッドが同じインメモリデータへアクセスするときの競合状態なども避けやすくなります。
各 Durable Object インスタンスは Actor インスタンスと見なせます。メッセージ(受信 HTTP/RPC リクエスト)を受け取り、付属する耐久ストレージまたはインメモリ状態を使い、自身のシングルスレッドコンテキストでロジックを実行し、最後に外界へメッセージ(送信 HTTP/RPC リクエストまたは応答)を送ります。別の Durable Object インスタンスへ送ることもできます。
各 Durable Object には どれだけの作業ができるか という能力があり、これがアプリケーションの プラットフォームを十分に活かすアーキテクチャ に影響します。
Durable Objects は Cloudflare のインフラにネイティブに統合されています。Cloudflare ネットワーク全体を活用した、分散ステートフルアプリケーション向けのサーバーレスプラットフォームとして使えます。
Cloudflare の多くの製品が Durable Objects を使っています。技術ブログでは、Durable Objects によってアプリケーション構築が簡単になった実例とユースケースを紹介しています。
これらの記事は、Durable Objects でスケーラブルなアプリケーションを設計する方法や、Cloudflare Developer Platform のほかの部分と統合する方法の参考にもなります。
- Durable Objects aren't just durable, they're fast: a 10x speedup for Cloudflare Queues ↗
- Behind the scenes with Stream Live, Cloudflare's live streaming service ↗
- DO it again: how we used Durable Objects to add WebSockets support and authentication to AI Gateway ↗
- Workers Builds: integrated CI/CD built on the Workers platform ↗
- Build durable applications on Cloudflare Workers: you write the Workflows, we take care of the rest ↗
- Building D1: a Global Database ↗
- Billions and billions (of logs): scaling AI Gateway with the Cloudflare Developer Platform ↗
- Indexing millions of HTTP requests using Durable Objects ↗
最後に、Durable Objects の技術的な実装や動作を知る助けになるブログ記事です。
- Durable Objects: Easy, Fast, Correct — Choose three ↗
- Zero-latency SQLite storage in every Durable Object ↗
- Workers Durable Objects Beta: A New Approach to Stateful Serverless ↗
「使用開始」ガイド に沿って、Durable Objects を使った最初のアプリケーションを作成してください。
-
SQLite を使う Durable Object あたりのストレージは、現在 1 GB です。一般提供(GA)時には 10 GB に引き上げられる予定です。 ↩