← Cloudflare Workers / workers / versions-and-deployments / gradual-deployments
С Durable Objects
Чтобы предоставить глобальная уникальность, существует только одна версия каждого Durable Object может выполняться одновременно. Это означает, что для Durable Objects постепенные развёртывания работают несколько иначе.
Когда вы создаёте новое поэтапное развёртывание для Worker с Durable Objects, каждому Durable Object назначается версия Worker в соответствии с процентными долями, заданными в развёртывание. Эта версия не изменится, пока вы не создадите новый деплой.
Пример
В этом примере предполагается, что вы уже создали три экземпляра Durable Object с именами "foo", "bar" и "baz".
Ваш Worker сейчас работает на версии, которую мы назовём версией «A», и вы хотите постепенно развернуть новую версию «B» этого Worker.
Ниже показано, как могут изменяться версии ваших Durable Objects по мере продвижения постепенного развёртывания:
| Конфигурация развертывания | "foo" | "bar" | "baz" |
|---|---|---|---|
| Версия A: 100% |
A | A | A |
| Версия B: 20% Версия A: 80% |
B | A | A |
| Версия B: 50% Версия A: 50% |
B | B | A |
| Версия B: 100% |
B | B | B |
Это всего лишь пример, поэтому версии, присвоенные вашим Durable Objects, могут отличаться. Тем не менее гарантируется следующее:
- В рамках одного развёртывания запросы к каждому Durable Object всегда используют одну и ту же версию Worker.
- Если вы указываете версии в том же порядке, что и в предыдущем развёртывании, и увеличиваете процент для какой-то версии, Durable Objects, которым ранее была назначена эта версия, не будут переназначены на другую версию. В этом примере Durable Object «foo» никогда не вернётся с версии «B» на версию «A».
- Durable Object будет только сбросить когда ему назначена другая версия, поэтому в этом примере каждый Durable Object будет сброшен только один раз.
Изменения жизненного цикла классов Durable Object
Версии сборок Worker, изменяющие жизненный цикл класса Durable Object, загрузить нельзя. Это касается как декларативного exports поле и устаревшее migrations массив. Это связано с тем, что изменения жизненного цикла Durable Object являются атомарными операциями. После развёртывания такого изменения откат к любой версии, предшествующей той, в которой оно было внесено, невозможен.
Изменения жизненного цикла Durable Object можно развернуть с помощью следующей команды:
npx wrangler deployЧтобы ограничить масштаб последствий таких развёртываний, изменения жизненного цикла Durable Object следует развёртывать отдельно от остальных изменений кода.
Чтобы понять, почему изменения жизненного цикла Durable Object являются атомарными операциями, рассмотрим гипотетический пример постепенного развёртывания удаления класса. Если бы удаление применилось к 50% инстансов Durable Object, запросы Workers к этим инстансам завершались бы ошибкой, поскольку инстансы уже были бы удалены.
Чтобы избежать ошибок, необходимо заранее развернуть версию Worker, не зависящую ни от одного из удаляемых Durable Objects. После этого можно развернуть удаление класса, не затрагивая трафик, и делать это постепенно нет смысла.