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

Durable Objects: デプロイ時のコード更新が既定で「遅延」になった(code_update_strategy)

デプロイしても動作中の Durable Object はすぐには切り替わらず、最大 5 分(300 秒)は旧コードのまま処理を終わらせてから新コードに移るようになった(2026-10-30)。

@CFchangelog · 投稿 2026-10-30

何が変わった?

Durable Object はオブジェクトごとに 1 つしか存在しないので、同時に動くコードも 1 バージョンだけ。以前はデプロイした瞬間に新コードが適用され、処理中のリクエストが中断されたり WebSocket が切られたりした。

今後は既定で deferred(遅延)になる。動作中のオブジェクトは休止(hibernate)できるまで最大 max_delay 秒だけ旧コードで動き続け、休止したところで新コードを採用する。Hibernation API を使っている WebSocket は、この切り替えをまたいでも接続が保たれる。

設定のしかた

wrangler.jsonc:

jsonc
{
  "durable_objects": {
    "bindings": [
      { "name": "CHAT_ROOM", "class_name": "ChatRoom" }
    ],
    "code_update_strategy": {
      "mode": "deferred",
      "max_delay": 60
    }
  }
}

wrangler.toml なら [durable_objects.code_update_strategy] に mode = "deferred"、max_delay = 60。

  • max_delay は秒で 0〜86400(24 時間)、ミリ秒精度。省略すると 300 秒。
  • mode は deferred か immediate。

1 回のデプロイだけ即時にする

障害対応で今すぐ直したいときや、デプロイ直後に CI が DO を呼んで新コードの動作を確かめるときは、そのデプロイだけ immediate にする。

bash
npx wrangler versions deploy <VERSION_ID>@100% --durable-objects-code-update-mode immediate

注意点

  • デプロイ直後のスモークテストに注意。 既定のままだと、デプロイ後しばらくは旧コードが応答することがある。デプロイ直後に新しい挙動を確認するテストは、immediate にするか、待ち時間を入れる。
  • ベストエフォート。 deferred でも処理の完了は保証されない。Cloudflare のランタイム更新などで max_delay 前にリセットされることがある(Cloudflare Workers: ランタイム更新時の grace period が最大 20 分に も参照)。
  • 長い処理は途中から再開できるように状態を保存しておく設計は引き続き必要。
  • 段階的デプロイ(gradual deployments)や REST API との関係は公式の「Durable Objects code updates」ページにある。

出典

X の元の投稿を開く