はじめに
Cloudflare Durable Objects(以下、Durable Objects)は、Cloudflare Workers上でステートフルなアプリケーションを構築するための強力なツールです。従来のサーバーレス環境では難しかった、状態を保持するアプリケーションを簡単に開発できるようになりますね。
今回は、Durable Objectsの概要、利用用途、コスト感について、わかりやすく解説します。
Durable Objectsとは?
要点
Durable Objectsは、グローバルに分散されたストレージとコンピューティングを組み合わせた、ユニークなサーバーレスプラットフォームです。
理由
従来のサーバーレス環境では、リクエストごとにインスタンスが起動・終了するため、状態を保持することが困難でした。Durable Objectsは、オブジェクトストレージにデータを永続化することで、この問題を解決します。
具体例
Durable Objectsは、WebSocketサーバー、カウンタ、ゲームの状態管理など、さまざまなステートフルなアプリケーションに適しています。例えば、チャットアプリケーションでは、Durable Objectsを使って、各ユーザーの接続状態やメッセージ履歴を管理できます。
// Durable Objectの例
export class Counter {
private count: number;
constructor(state: DurableObjectState) {
this.count = 0;
}
async fetch(request: Request) {
this.count++;
return new Response(`Count: ${this.count}`);
}
}このシンプルな例では、Durable Objectがリクエストを受け取るたびにカウンターをインクリメントしています。このcount変数は、Durable Objectのストレージに永続化されるため、Workerが停止しても値は保持されます。
要点
Durable Objectsは、グローバルに一貫性のある状態を必要とするアプリケーションに最適なソリューションです。
Durable Objectsの利用用途
要点
Durable Objectsは、リアルタイムアプリケーション、コラボレーションツール、eコマースなど、幅広い分野で活用できます。
理由
Durable Objectsは、低遅延でグローバルにアクセス可能な状態を提供するため、これらのアプリケーションのパフォーマンスを向上させることができます。
具体例
- リアルタイムアプリケーション: チャット、ゲーム、ライブストリーミングなど
- コラボレーションツール: ドキュメント編集、プロジェクト管理など
- eコマース: カート、在庫管理、パーソナライズされたレコメンデーションなど
- その他: 分散ロック、レート制限、A/Bテストなど
先日、近所の猫カフェでDurable Objectsを使ったリアルタイム猫観察システムを作ったら面白いんじゃないか、と思いつきました。各猫の動きをDurable Objectsで管理し、Webサイトでリアルタイムに表示するんです。猫好きにはたまらないサービスになるはず!いつか作ってみたいですね。
具体例:ライブ配信中の「リアルタイム・アンケート」システム
この例では、管理者が管理画面からアンケートを開始すると、視聴者全員の動画プレイヤー上にポップアップが表示される仕組みを想定しています。
1. 全体構成図
Durable Objectが「情報の司令塔」となり、管理者と視聴者を仲介します。
2. Durable Objectsの実装イメージ(JavaScript)
Durable Object内で、現在アクティブな接続(WebSockets)を管理し、アンケートの状態を保持します。
export class LivePollSync {
constructor(state) {
this.state = state;
this.sessions = []; // 接続中の視聴者リスト
this.currentPoll = null; // 現在実施中のアンケート内容
}
async fetch(request) {
const upgradeHeader = request.headers.get('Upgrade');
if (!upgradeHeader || upgradeHeader !== 'websocket') {
return new Response('Expected Upgrade: websocket', { status: 426 });
}
const [client, server] = Object.values(new WebSocketPair());
await this.handleSession(server);
return new Response(null, { status: 101, webSocket: client });
}
async handleSession(ws) {
ws.accept();
this.sessions.push(ws);
ws.onmessage = async (msg) => {
const data = JSON.parse(msg.data);
// 管理者からの命令:アンケート開始
if (data.type === 'START_POLL') {
this.currentPoll = data.poll;
this.broadcast({ type: 'NEW_POLL', poll: this.currentPoll });
}
// 視聴者からの回答:集計
if (data.type === 'VOTE') {
// Durable Objectのストレージに結果を保存(永続化)
let votes = await this.state.storage.get(data.optionId) || 0;
await this.state.storage.put(data.optionId, votes + 1);
}
};
}
// 全接続ユーザーに一斉送信(ブロードキャスト)
broadcast(message) {
this.sessions.forEach(ws => ws.send(JSON.stringify(message)));
}
}3. この仕組みのメリット
- 超低遅延の同期:
一般的なデータベース(Polling方式)では数秒のラグが生じますが、Durable ObjectsとWebSocketを組み合わせることで、管理者がボタンを押した瞬間に数万人のプレイヤーにアンケートを表示できます。 - 強力な整合性:
アンケートの「回答数」はDurable Object内で一元管理されるため、データの不整合(ダブルカウントなど)を防ぎながら正確なリアルタイム集計が可能です。 - サーバーレスの簡便さ:
Redisや外部のPub/Subサーバーを自前で構築・運用する必要がなく、Cloudflareのインフラだけで完結します。
4. 実際のワークフロー
- 管理者の操作: 管理パネルで「どのプロンプト(例:今日のMVPは?)」を出すか決定し、送信ボタンを押す。
- キューの受信: Worker経由で特定のDurable Object(そのライブ配信専用のIDを持つインスタンス)にリクエストが届く。
- 一斉配信: Durable Objectが保持している全視聴者のWebSocket接続に対し、アンケート内容を転送。
- フロントエンドの反応: 視聴者の動画プレイヤー(ReactやVue.js等)がメッセージを受け取り、映像の上にオーバーレイでアンケート画面を描画。
要点
Durable Objectsは、スケーラブルで信頼性の高いステートフルなアプリケーションを構築するための強力な基盤となります。
Durable Objectsのコスト感
要点
Durable Objectsの料金は、リクエスト数、ストレージ使用量、データ転送量に基づいて課金されます。
理由
従来のサーバーレス環境と同様に、従量課金制であるため、使用量に応じてコストを最適化できます。
一般的に、小規模なアプリケーションであれば、無料枠内で利用できる場合もあります。大規模なアプリケーションでは、事前にコストを見積もることが重要です。
要点
Durable Objectsは、コスト効率の高いステートフルなサーバーレス環境を実現するための選択肢の一つです。
まとめ
Durable Objectsは、Cloudflare Workers上でステートフルなアプリケーションを構築するための革新的なテクノロジーです。サーバーレスのメリットを活かしつつ、状態を保持する必要があるアプリケーションに最適です。
ぜひDurable Objectsを活用して、新しい可能性を追求してみてくださいね。



コメント