テック技報最新号へ →
インフラ

Durable Objects: 失敗した fetch / RPC をランタイムが自動リトライする(retryable() / retry)

Durable Object への fetch() と RPC が到達前に落ちたとき、ランタイムが最大 4 回まで自動でやり直すようになった。冪等なメソッドだけ retryable() で二重実行を許し、スタブごとに上限を変えられる(Wrangler 4.158.0+)。

@CFchangelog · 投稿 2026-11-05

いつ効くか

Worker や別の Durable Object から DO を呼ぶとき、短いネットワーク断など「到達前」の一時エラーで落ちていたケース。自分でリトライループを書く必要がなくなる。

次はリトライしない。

  • DO のコードが投げたエラー
  • .overloaded が true のエラー

接続が切れて「届いたかどうか分からない」ときもリトライするが、最初の呼び出しが届いていれば DO 側が再実行を拒む。メソッドが二重に走らないのが既定。

冪等なメソッドだけ二重実行を許す

カートの数量を「セット」するような冪等な処理は、cloudflare:durable-objects の retryable() で印を付ける。加算のように二度走ると壊れる処理には付けない。

ts
import { DurableObject } from "cloudflare:workers";
import { retryable } from "cloudflare:durable-objects";

export class Cart extends DurableObject {
  static {
    retryable(this.prototype.setQuantity);
  }

  async setQuantity(itemId: string, quantity: number): Promise<void> {
    await this.ctx.storage.put(itemId, quantity);
  }

  async addOne(itemId: string): Promise<void> {
    const quantity = (await this.ctx.storage.get<number>(itemId)) ?? 0;
    await this.ctx.storage.put(itemId, quantity + 1);
  }
}

スタブごとの上限

既定は最大 4 回、初回開始から 10 秒を超えてリトライは始めない。get() / getByName() の retry で変えられる。maxRetries は 0〜10、timeoutMs は 500〜60,000。

ts
const stub = env.CART.getByName("user-123", {
  retry: { maxRetries: 1, timeoutMs: 2000 },
});

注意点

  • 自分でもリトライしている場合。 自分の 1 試行の中にランタイムのリトライが含まれる。試行回数を減らすか、そのスタブだけ maxRetries: 0 にする。
  • retryable() と retry オプションは Wrangler 4.158.0 以降。
  • 到達後にアプリが投げた例外は対象外。業務エラーのリトライはこれまでどおり自分で設計する。

出典

X の元の投稿を開く