为了提供全局唯一性(global uniqueness),每个 Durable Object 同时只能运行一个版本。这意味着 Durable Objects 的渐进式部署工作方式略有不同。
当你为包含 Durable Objects 的 Worker 创建新的渐进式部署时,每个 Durable Object 会根据你在部署中配置的百分比分配 Worker 版本。此版本在你创建新部署之前不会改变。
此示例假设你之前已创建了名为 "foo"、"bar" 和 "baz" 的三个 Durable Object 实例。
你的 Worker 当前处于我们称为版本 "A" 的版本,你想逐步部署 Worker 的新版本 "B"。
以下是随着渐进式部署推进,Durable Objects 版本可能的变化方式:
| Deployment config | "foo" | "bar" | "baz" |
|---|---|---|---|
| Version A: 100% |
A | A | A |
| Version B: 20% Version A: 80% |
B | A | A |
| Version B: 50% Version A: 50% |
B | B | A |
| Version B: 100% |
B | B | B |
这只是一个示例,因此分配给你的 Durable Objects 的版本可能不同。但以下情况是有保证的:
- 对于给定部署,对每个 Durable Object 的请求将始终使用相同的 Worker 版本。
- 当你以与上一部署相同的顺序指定每个版本并增加某个版本的百分比时,先前分配到该版本的 Durable Objects 不会被分配到不同版本。在此示例中,Durable Object "foo" 永远不会从版本 "B" 回退到版本 "A"。
- Durable Object 仅在分配到不同版本时才会重置(reset),因此在此示例中每个 Durable Object 只会重置一次。
无法上传更改 Durable Object 类生命周期的 Worker bundle 版本。这适用于声明式 exports 字段和旧版 migrations 数组。这是因为 Durable Object 生命周期更改是原子操作。一旦部署了生命周期更改,就无法回滚到包含该更改的版本之前的任何版本。
可以使用以下命令部署 Durable Object 生命周期更改:
npx wrangler deployyarn wrangler deploypnpm wrangler deploy为了限制这些部署的影响范围,Durable Object 生命周期更改应独立于其他代码更改进行部署。
要理解为什么 Durable Object 生命周期更改是原子操作,请考虑逐步部署类删除的假设示例。如果对 50% 的 Durable Object 实例应用删除,则请求这些 Durable Object 实例的 Worker 将失败,因为它们已被删除。
要在不产生错误的情况下执行此操作,必须已经推出不依赖任何待删除 Durable Object 的 Worker 版本。然后,你可以部署类删除而不影响任何流量,因此没有理由逐步进行。