shiichan

Durable Objects のデプロイが優しくなった!コード更新はデフォルトで最大 5 分待つよ

みんな、しぃちゃんだよ!Durable Objects を使っている人に大きな挙動変更のお知らせだよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

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 で動かしていて、デプロイのたびにヒヤッとしていた人に刺さるよ!