Durable Objects: 失敗した fetch / RPC をランタイムが自動リトライする(retryable() / retry)
Durable Object への fetch() と RPC が到達前に落ちたとき、ランタイムが最大 4 回まで自動でやり直すようになった。冪等なメソッドだけ retryable() で二重実行を許し、スタブごとに上限を変えられる(Wrangler 4.158.0+)。
いつ効くか
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 以降。- 到達後にアプリが投げた例外は対象外。業務エラーのリトライはこれまでどおり自分で設計する。