Durable Objects 现默认延迟应用代码更新
Durable Objects 可以跨请求保持活动状态,使您能够运行长时间运行的 Agent、维护长期 WebSocket 连接,并在众多客户端之间协调状态。之所以能做到这一点,是因为每个 Durable Object 都是全局唯一的,这也意味着它同一时间只能运行一个版本的代码。此前,当您部署对 Durable Objects 代码的更改时,该更改会立即生效,这可能会中断正在进行的工作并终止已打开的连接。
Durable Objects 现在默认延迟应用代码更新。部署时,活动的 Durable Object 在等待进入休眠期间,最多可以继续运行其当前代码 5 分钟(300 秒)。这为正在进行的工作留出了完成的时间。使用 Hibernation API 的 WebSocket 连接在对象休眠后采用新代码时仍保持连接。
对于活动的 Durable Object,代码更新遵循以下流程:
flowchart TD
accTitle: Code updates for an active Durable Object
accDescr: By default, an active object can keep running its current code until it hibernates or the delay ends. After hibernating, it starts on new code on the next request. If the delay ends first, or immediate mode is selected, it resets and adopts the new code. Deferral is best effort.
A["You deploy new code"] -->|"Default: deferred"| B["The object can keep running<br/>its current code"]
B --> C{"Hibernates before<br/>the delay ends?"}
C -->|Yes| D["Starts on the new code<br/>on the next request"]
C -->|No| E["The object resets<br/>and adopts the new code"]
A -.->|"Override: immediate"| E
若要更改延迟时间,请在 Wrangler 配置中将 code_update_strategy 添加到 durable_objects:
{
"durable_objects": {
"bindings": [
{
"name": "CHAT_ROOM",
"class_name": "ChatRoom",
},
],
"code_update_strategy": {
"mode": "deferred",
"max_delay": 60,
},
},
}[[durable_objects.bindings]]
name = "CHAT_ROOM"
class_name = "ChatRoom"
[durable_objects.code_update_strategy]
mode = "deferred"
max_delay = 60max_delay 以秒为单位,取值范围为 0 到 86400(24 小时),精度为毫秒。省略该值则使用默认值 300 秒。
若要为单次部署设置策略,请传入 --durable-objects-code-update-mode 并指定 immediate 或 deferred <duration>。例如,在事件处理期间立即应用更新,或者当您的部署工具在部署后立即调用 Durable Object 并需要新代码时:
npx wrangler versions deploy <VERSION_ID>@100% --durable-objects-code-update-mode immediateyarn wrangler versions deploy <VERSION_ID>@100% --durable-objects-code-update-mode immediatepnpm wrangler versions deploy <VERSION_ID>@100% --durable-objects-code-update-mode immediatedeferred 代码更新是尽力而为的,不保证每个操作都能完成。对象仍可能在达到 max_delay 之前重置,例如在 Cloudflare 运行时更新期间。
有关详细信息(包括此功能与逐步部署和 REST API 的交互方式),请参阅 Durable Objects 代码更新。