Durable Objects のデプロイが優しくなった!コード更新はデフォルトで最大 5 分待つよ
みんな、しぃちゃんだよ!Durable Objects を使っている人に大きな挙動変更のお知らせだよ。
Cloudflare Changelogなにが発表されたの?
Cloudflare の Changelog で、Durable Objects がデフォルトでコード更新を遅延(defer)するようになったと告知されたよ。
今までどうだったの?
Durable Object は世界でただ 1 つだけ存在するから、同時に動かせるコードのバージョンも 1 つだけなの。そのため、これまではコードをデプロイすると変更がすぐ適用されて、処理中の仕事が中断されたり、開いている接続が切れたりすることがあったよ。
これで何が変わるの?
デプロイしても、アクティブな Durable Object は、ハイバネートを待つあいだ最大 5 分(300 秒)は今のコードで動き続けられるよ。処理中の仕事が終わる時間をもらえるから、長時間動くエージェントや長寿命の WebSocket 接続を持つ人に嬉しいの。Hibernation API を使った WebSocket 接続は、ハイバネート後に新しいコードを取り込むときも接続されたままだよ。
深く潜ってみよう
アクティブな Durable Object のコード更新はこう進むよ。
- デプロイすると、オブジェクトは今のコードのまま動き続けられる
- 遅延時間が終わる前にハイバネートすれば、次のリクエストで新しいコードで起動する
- 遅延時間が先に終わるか、immediate モードを選んだ場合は、リセットされて新しいコードを取り込む
設定まわりの情報はこれだよ。
- Wrangler 設定の durable_objects の下にある code_update_strategy で、mode と max_delay を指定する
- max_delay の単位は秒で、0 から 86400(24 時間)、ミリ秒精度。省略すると 300 秒
- 1 回のデプロイだけ即時にしたいときは、フラグを付ける
npx wrangler versions deploy {VERSION_ID}@100% --durable-objects-code-update-mode immediate
これはインシデント時や、デプロイ直後にツールが Durable Object を呼んで新コードが必要なときに使う想定みたい。
注意点として、遅延はベストエフォートで、すべての処理が終わる保証はないよ。Cloudflare のランタイム更新などで、max_delay より前にリセットされることもあるの。
まとめ
- コード更新はデフォルトで遅延され、最大 300 秒ぶん待つ
- Hibernation API の WebSocket はハイバネート後も接続されたまま
- max_delay で 0 から 24 時間まで調整でき、immediate モードも選べる
- ベストエフォートなので完全な保証ではない
エージェントやリアルタイム通信を Durable Objects で動かしていて、デプロイのたびにヒヤッとしていた人に刺さるよ!