耐久オブジェクトスタブを作成し、リクエストを送信する
耐久オブジェクトスタブは、リモート耐久オブジェクトにリクエストを送信するために使用されるクライアントオブジェクトです。
OBJECT_NAMESPACE.get(id) は耐久オブジェクトを作成します。
耐久オブジェクトはE-orderセマンティクスを実装しています。同じ耐久オブジェクトに対して複数回呼び出しを行うと、それらの呼び出しは行った順序でリモート耐久オブジェクトに配信されることが保証されます。E-orderセマンティクスは、多くの分散プログラミングの問題を容易にします。
しかし、ランダムなネットワークの中断やその他の一時的な問題により、耐久オブジェクトスタブがリモート耐久オブジェクトから切断されることがあります。切断されたスタブは永久に壊れています。このシナリオでは、すべての進行中の呼び出しと今後の呼び出しは 例外 で失敗します。
耐久オブジェクトに新しいリクエストを行うには、再度 OBJECT_NAMESPACE.get(id) を呼び出して新しい耐久オブジェクトスタブを取得する必要があります。新しいスタブへのリクエストと古いスタブへのリクエストの間には順序の保証はありません。順序が問題でない場合は、リクエストごとに新しい耐久オブジェクトを作成できます。
let durableObjectStub = OBJECT_NAMESPACE.get(id);idDurableObjectId-
この耐久オブジェクト名前空間で
newUniqueId()、idFromName()、またはidFromString()を使用して構築されたID。詳細については、耐久オブジェクトにアクセスするを参照してください。 -
このメソッドは、リモートオブジェクトへのアクセスを提供するローカルクライアントであるオブジェクトを構築します。
-
リモートオブジェクトがまだ存在しない場合は、作成されます。したがって、スタブから常にアクセス可能なオブジェクトがあります。
-
このメソッドは、リモートオブジェクトに接続する前に常にオブジェクトを即座に返します。これにより、ネットワークの往復を待つことなく、すぐにオブジェクトへのリクエストを開始できます。
-
耐久オブジェクトを呼び出すには、次の方法があります:
- 耐久オブジェクトの
fetch()ハンドラーにHTTPリクエストを送信する。 - 耐久オブジェクトクラスで定義されたリモートプロシージャコール(RPC)メソッドを呼び出す(2024-04-03以降の互換性日を持つWorkersで利用可能)。
- WebSocket APIを使用する。
RPCを使用するには、耐久オブジェクトクラスが組み込み型 DurableObject を拡張する必要があります。次に、耐久オブジェクトクラスの公開メソッドは、Worker内の耐久オブジェクトスタブから呼び出すことができるRPCメソッドとして公開されます。すべてのRPC呼び出しは非同期であり、シリアライズ可能な型を受け入れ、返し、例外を伝播します。詳細については、Workers RPCを参照してください。
import { DurableObject } from "cloudflare:workers";
export class Counter extends DurableObject {
async increment(amount = 1) { let value: number = (await this.ctx.storage.get("value")) || 0; value += amount; this.ctx.storage.put("value", value); return value; }}// 耐久オブジェクトを呼び出すWorkerlet durableObjectStub = env.COUNTERS.get(id);let response = await durableObjectStub.increment();カウンターを構築するを参照して、完全な例を確認してください。
let response = await durableObjectStub.fetch(request);// または、URLを直接渡す:let response = await durableObjectStub.fetch(url, options);耐久オブジェクトの fetch() ハンドラーに渡される url は、適切に形成されたURLである必要がありますが、公開解決可能なホスト名である必要はありません。次のことができます:
- クライアントの
Requestをそのままfetch()ハンドラーに渡す。 http://do/some-pathのような内部URLスキームをfetch()ハンドラーのurlパラメータとして使用します。これにより、クライアント向けWorkerと耐久オブジェクト間で状態を共有するための独自のパスやクエリパラメータベースのアプローチを構築できます。- または、独自の
Requestオブジェクトを構築し、Headersオブジェクトを使用して耐久オブジェクトに渡したいデータを表すキーと値のペアを渡すことができます。
以下の例は、独自の Request オブジェクトを構築する方法を示しています:
// 新しいRequestを構築し、ヘッダーを介して耐久オブジェクトにメタデータを渡すlet doReq = new Request("http://do/write", { headers: { "user-id": userId }})let resp = await durableObjectStub.fetch(doReq)
// または、URLクエリパラメータやパスを使用let resp = await durableObjectStub.fetch(`http://do/write?userId=${userId}`)Cloudflare REST APIは、耐久オブジェクト名前空間内の耐久オブジェクトのリストと、アカウントに関連付けられた名前空間のリストを取得することをサポートしています。