デプロイ後、アクティブなCloudflare Durable Objectは、休止状態に移行するまで、または設定された時間が経過するまで、現在のコードバージョンで動作を続けられるようになりました。10月30日、Cloudflareは更新の延期をデフォルトに設定し、最大5分の遅延を設けました。これにより、デプロイ中にすでに稼働しているオブジェクトの動作が変わります。更新によって必ず即座に処理が中断されるわけではなく、条件を満たすWebSocket接続は新バージョンへの移行時にも維持される場合があります。

デプロイ中に何が起きるのか
Durable Objectsは、永続的なIDと状態を持つアドレス指定可能なオブジェクトです。Cloudflareは、クライアント間の調整、長時間の処理、WebSocketセッションなどに利用しています。各オブジェクトに対して同時に有効になるコードバージョンは1つです。そのため、コードを即座に置き換えると、アクティブなインスタンスがリセットされ、処理や接続が中断される可能性があります。
現在の標準的な動作は、更新を遅らせて移行する方式です。デプロイ後も、アクティブなオブジェクトは旧バージョンでリクエストを処理し続けます。5分が経過する前に休止状態へ移行すれば、次にアクセスがあったときに新バージョンが起動します。5分が経過してもオブジェクトがアクティブなままなら、リセットされて新バージョンに切り替わります。一方、Workerのデプロイはこれとは別に完了します。この遅延が影響するのは、すでにアクティブなオブジェクトが新しいコードを実行し始めるタイミングです。
どのようなサービスに役立つのか
この変更は、1つのオブジェクトがリクエスト間も処理を保持するサービスにとって重要です。たとえば、長時間のセッション、複数クライアント間の調整、WebSocket接続などが該当します。更新を延期することで、オブジェクトは更新前に現在の処理を自然に終えたり、休止状態に移行したりする時間を得られます。WebSocketについてCloudflareは、Hibernation APIを使う接続であれば、オブジェクトが休止状態を経て新しいコードを読み込んだ後も接続が維持されると説明しています。
チームが実務上確認すべきなのは、アクティブなオブジェクトのうち、数分以上ビジー状態が続く可能性があるものと、使用しているWebSocket APIです。これによって、新しいデプロイ方式がアプリケーションの円滑な移行に役立つのか、それとも強制更新時に接続が終了するのかが変わります。
5分は猶予時間であり、保証ではない
Cloudflareは、更新の延期はベストエフォートであり、たとえばランタイム環境の更新時には、オブジェクトがより早くリセットされる可能性があると説明しています。最大遅延の終了時点で休止状態に移行していない場合、プラットフォームはリセットを通じて新バージョンを適用します。そのため、重要な状態は永続ストレージに保存し、処理は再実行される可能性を考慮して設計する必要があります。Cloudflareのドキュメントは、デプロイをまたいで保持すべき状態を保存するよう推奨しており、アクティブなインスタンスのメモリに依存しないよう案内しています。
チームはDurable Objectsの設定で動作を変更できます。即時更新モードを指定することも、延期する時間を別途設定することも可能です。緊急の修正など、新バージョンをただちに有効にする必要がある場合は、即時モードが役立ちます。延期時間を長くすればオブジェクトに余裕を与えられますが、一部のインスタンスが旧バージョンで動作する期間も長くなります。
次回のデプロイ前に確認すること
WorkerとDurable Objectが異なるバージョンで動作する可能性のある期間に、両者のリクエストが互換性を保つか確認してください。重要な状態がメモリだけでなくストレージにも保存されているか確認しましょう。WebSocketについては、アプリケーションがHibernation APIを使用しているかを確かめてください。通常の接続は、更新の適用時に終了する可能性があります。デプロイで即時移行が必要な場合は、新しいデフォルト設定に頼らず、モードを明示的に設定してください。
つまりCloudflareは、デプロイ時の標準的なトレードオフを変更しました。アクティブなオブジェクトには自然に移行するための限られた時間が与えられ、チームは設定によって更新を早めることもできます。開発者にとって特に有益なのは、次回のデプロイ前に旧バージョンと新バージョンの互換性、状態の保持、WebSocketの種類を確認することです。