コンテンツにスキップ

Durable Objectsからキューを使用する

Durable Object内からキューに公開します。

以下の例では、Durable Object内からCloudflare Queuesに公開するためのWorkerスクリプトの書き方を示します。

前提条件:

wrangler.tomlファイルを次のように構成します:

name = "my-worker"
[[queues.producers]]
queue = "my-queue"
binding = "YOUR_QUEUE"
[durable_objects]
bindings = [
{ name = "YOUR_DO_CLASS", class_name = "YourDurableObject" }
]
[[migrations]]
tag = "v1"
new_classes = ["YourDurableObject"]

以下のWorkerスクリプトは:

  1. Durable Objectスタブを作成するか、userIdに基づいて既存のものを取得します。
  2. リクエストデータをDurable Objectに渡します。
  3. Durable Object内からキューに公開します。

Durable Object内のconstructor()は、this.envfetch()ハンドラーに対してEnvironmentを利用可能にします。

interface Env {
YOUR_QUEUE: Queue;
YOUR_DO_CLASS: DurableObjectNamespace;
}
export default {
async fetch(req: Request, env: Environment): Promise<Response> {
// 各Durable ObjectがクエリパラメータのuserIdにマッピングされていると仮定します
// 本番アプリケーションでは、これはアプリケーションによって定義されたuserIdであり、
// それを最初に検証(および/または認証)します。
let url = new URL(req.url)
let userIdParam = url.searchParams.get("userId")
if (userIdParam) {
// そのuserIdに基づいてDurable Objectを作成(または取得)します。
let durableObjectId = env.YOUR_DO_CLASS.idFromName(userIdParam);
// そのDurable Objectを呼び出すための「スタブ」を取得します
let durableObjectStub = env.YOUR_DO_CLASS.get(durableObjectId);
// そのDurable Objectにリクエストを渡し、応答を待ちます
// これは、最初の初期化時にDurable Objectクラス(後で定義)でコンストラクタを1回呼び出し、
// 各リクエストでfetchメソッドを呼び出します。
// 元のRequestをDurable Objectのfetchメソッドに渡します
let response = await durableObjectStub.fetch(req);
// これは「キューに書き込みました」と返しますが、任意の応答を返すことができます。
return response;
}
return new Response("userIdを提供する必要があります", { status: 400 });
}
}
export class YourDurableObject implements DurableObject {
constructor(private state: DurableObjectState, private env: Env) {}
async fetch(request: Request) {
// 簡潔さのためにエラーハンドリングは省略されています。
// キューに公開します
await this.env.YOUR_QUEUE.send({
id: this.state.id.toString() // Durable ObjectのIDをキューに書き込みます
// 他のプロパティをキューに書き込むこともできます
});
return new Response("キューに書き込みました")
}
}