Синий / Зеленый Развертывания с Azure ServiceFabric
В настоящее время я создаю приложение с использованием инфраструктуры ReliableActors в Azure ServiceFabric. По мере того, как мы расширяемся, я смотрю на сине-зеленые развертывания. Я вижу, как это сделать, используя систему без сохранения состояния. Есть ли способ сделать это с помощью государственных актеров?
1 ответ
Service Fabric - это непрерывные обновления, а не обмены развертыванием, как обмен VIP. Службы как без сохранения состояния, так и с сохранением состояния обновляются одинаково, но есть несколько дополнительных нюансов для сохранения состояния, о которых я расскажу позже.
Под последовательным обновлением я подразумеваю, что обновления приложений выполняются на месте, по одному домену обновления за раз, чтобы не было простоев и внезапных переключений. Скользящее обновление в Service Fabric можно выполнить в безопасном "управляемом" режиме, где платформа выполнит проверки работоспособности перед переходом к следующему домену обновления и автоматически откатится, если проверки работоспособности не пройдены.
ОК, все звучит хорошо. Но как вы выполняете сине-зеленые развертывания, когда обновления всегда обновляются?
Здесь используются типы и версия приложения. Вместо двух "сред", в которых могут храниться два запущенных приложения, в Service Fabric существует концепция типов приложений с поддержкой версий, из которых можно создавать экземпляры приложений. Вот пример того, как это работает:
Допустим, я хочу сделать приложение под названием Foo. Мое приложение Foo определено как тип приложения, назовите его FooType. Это похоже на определение класса в C#. И, как класс в C#, я могу создавать экземпляры моего типа. Каждый экземпляр имеет уникальное имя, аналогично тому, как каждый экземпляр объекта класса имеет уникальное имя переменной. Но в отличие от классов в C#, мой FooType имеет номер версии. Затем я могу "зарегистрировать" тип и версию приложения в моем кластере:
FooType 1.0
После регистрации я могу создать экземпляр этого приложения:
"fabric:/FooApp" of FooType 1.0
Теперь предположим, что я разрабатываю версию 2.0 своего приложения. Поэтому я регистрирую версию 2.0 моего FooType в кластере:
FooType 1.0
FooType 2.0
Теперь у меня зарегистрированы обе версии FooType, и у меня все еще работает экземпляр 1.0:
"fabric:/FooApp" of FooType 1.0
Вот где это весело. Я могу сделать несколько интересных вещей:
Я могу взять "fabric:/FooApp" - экземпляр FooType 1.0 - и обновить его до FooType 2.0. Это будет непрерывное обновление этого работающего приложения.
Или.. Я могу оставить "fabric: / FooApp" в покое и создать новый экземпляр моего приложения версии 2.0:
"fabric:/FooApp" of FooType 1.0
"fabric:/FooAppv2Test" of FooType 2.0
Теперь у меня есть два приложения, работающие параллельно, в одном кластере. Один является экземпляром 1.0, а другой - экземпляром 2.0. С некоторой настройкой портов и конечных точек приложения я могу гарантировать, что пользователи все еще переходят на экземпляр 1.0, пока я тестирую экземпляр 2.0.
Отлично, все мои тесты проходят на экземпляре 2.0, так что теперь я могу смело брать экземпляр 1.0 и обновить его до версии 2.0 FooType. Опять же, это непрерывное обновление этого экземпляра (fabric:/FooApp), оно не переносит пользователей в новый экземпляр (fabric:/FooAppv2Test). Позже я пойду и удалю fabric: / FooAppv2Test, потому что это было только для тестирования.
Однако одним из преимуществ сине-зеленого цвета является возможность возврата к другому развертыванию в случае сбоя нового. Что ж, у вас все еще зарегистрированы как 1.0, так и 2.0 FooType. Так что, если ваше приложение стало плохо работать после обновления с 1.0 до 2.0, вы можете просто "обновить" его до 1.0! На самом деле, вы можете "обновить" экземпляр приложения с любым количеством разных версий его типа! И вам не нужно, чтобы экземпляры всех версий ваших приложений работали так же, как в среде подкачки, у вас просто зарегистрированы разные версии и один экземпляр приложения, который может "обновляться" между версиями.
Я упомянул предостережения с сохранением состояния. При работе с сервисами с отслеживанием состояния важно помнить, что состояние приложения - данные ваших пользователей - содержится в экземпляре приложения (fabric:/FooApp), поэтому для того, чтобы ваши пользователи могли видеть их данные, вам нужно сохранить их в этом экземпляре. Вот почему мы выполняем обновления вместо замены развертывания.
Это просто основная идея. Есть и другие способы, с помощью которых вы можете поиграть с типами, версиями и экземплярами приложений, в зависимости от ваших целей и работы вашего приложения, но это в другой раз.