Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Durable Object のインメモリ状態

最終更新 Markdown で表示Agent セットアップ

インメモリ状態とは、各 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 のメモリは共有する可能性があり、想定外の結果につながります。そのため、グローバル変数は使わないのが最善です。

役に立ちましたか?