インメモリ状態とは、各 Durable Object が、ある時点でアクティブなインスタンスを 1 つ持つことを指します。その Durable Object へ送られたリクエストは、すべて同じインスタンスが処理します。状態の一部はメモリに保存できます。
Durable Object の変数は、その Durable Object がメモリから退去されないかぎり、状態を保持します。
よくあるパターンは、初回アクセス時に 永続ストレージ から Durable Object を初期化し、インスタンス変数を設定することです。以降のアクセスは同じ Durable Object にルーティングされるため、永続ストレージを再度呼ばずに、初期化済みの値を返せます。
import { DurableObject } from "cloudflare:workers";
export class Counter extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
// `blockConcurrencyWhile()` ensures no requests are delivered until
// initialization completes.
this.ctx.blockConcurrencyWhile(async () => {
let stored = await this.ctx.storage.get("value");
// After initialization, future reads do not need to access storage.
this.value = stored || 0;
});
}
// Handle HTTP requests from clients.
async fetch(request) {
// use this.value rather than storage
}
}ある Durable Object インスタンスは、同じ Worker コードで定義された他のインスタンスと、グローバルメモリを共有することがあります。
上の例で、インスタンス変数 this.value の代わりにグローバル変数 value を使うのは誤りです。2 つの異なる Counter インスタンスは、それぞれ this.value 用のメモリを持ちますが、グローバル変数 value のメモリは共有する可能性があり、想定外の結果につながります。そのため、グローバル変数は使わないのが最善です。