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

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

## なにが発表されたの？

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