Как лазурные веб-сайты с миграциями EF обеспечивают целостность при обновлении

Сценарий прост: с использованием первых миграций EF-кода, с несколькими экземплярами веб-сайтов в лазурном виде, размером до 100 ГБ (при условии, что azure SQL), множеством активных одновременных пользователей.. 20k для этого.

Цель: выталкивать обновление с активными пользователями, сохранять целостность при обновлении.

Я просеял все документы, которые я могу найти. Однако основные детали, кажется, отсутствуют, или я откровенно игнорирую их. Когда Azure получает запрос на обновление через FTP/ git/tfs, как он обрабатывает обновление? Что он делает с активными пользователями? Например, он блокирует входящие запросы ко всем экземплярам, ​​позволяет элементам обрабатывать завершение, обновлять/заменять каждый экземпляр, разрешать процесс миграции EF, а затем разрешать запуск трафика снова? Если он обновляет/обновляет все экземпляры одновременно, как он обеспечивает миграцию EF только один раз? Если он обновляет экземпляры в режиме ускоренного обновления (обновление 1 за один раз без блокировки входящего трафика), как он может обеспечить целостность, поскольку экземпляры в более старом состоянии могли бы/могли бы нарушиться?

Основной вопрос, каков реальный процесс после получения запроса на обновление? Каковы рекомендации по обновлению веб-сайта в прямом эфире?

Ответ 1

Проще говоря, это не так.

EF Миграции и развертывание Azure - это два совершенно разных зверя. Развертывание Azure дает вам множество опций, в том числе обновление и размещение слотов, вы, вероятно, видели Разверните веб-приложение в Azure App Service, для других читателей это хорошая начальная точка.

В целом модель развертывания Azure связана с активными подключениями к стеку IIS/Web Site, в общем случае обновление обеспечивает непрерывный доступ пользователя, заставляя экземпляр развертываться из пула балансировки нагрузки и перенаправляя трафик на другие экземпляры. Затем он циклически проходит через экземпляры, обновляющиеся по очереди.

Это означает, что в любой момент времени во время развертывания обновления будет существовать несколько версий вашего кода, запущенных одновременно.

Если ваша модель EF не изменилась между версиями кода, то развертывание Azure работает как очарование, пользователи даже не знают, что это происходит. Но если вам нужно применить миграцию как часть переноса BEWARE

В общем случае EF загружает только модель, если совпадают версии кода и БД. очень сложно использовать EF Migrations и одновременно поддерживать несколько версий кода модели

EF Миграции в основном контролируются инициализатором базы данных. Подробнее см. Подробнее об обновлении базы данных с помощью переноса.

Как разработчик вы можете выбрать, как и когда будет обновляться база данных, но знайте, что если вы используете Mirgrations и обновления для развертывания:

  • Новый код не будет легко запускаться против старой схемы данных.
  • Если старый код/​​приложение перезапустится, многие стратегии инициализации по умолчанию попытаются перевернуть схему обратно, если это произойдет, обратитесь к пункту 1.;)
  • Если вы столкнетесь с тем, что модель EF загружается с неправильной версией схемы, вы будете испытывать исключения и общие сбои, когда код пытается использовать элементы схемы, которых нет там

Простейшим способом управления переносом EF на реальном сайте является удаление всех экземпляров сайта для развертываний, включающих миграцию EF - Вы можете использовать страницу обслуживания или перенаправление, что до вас.

Если вы столкнулись с этой проблемой, вероятно, лучше всего вручную применить обновление БД, а затем, если оно не удастся, вы можете легко прервать развертывание, потому что оно еще не началось!

В противном случае разверните обновление, и первый экземпляр, который будет развернут, запустит миграцию, если инициализатор настроен для этого...

Если вы абсолютно должны иметь непрерывное развертывание как кода сайта/содержимого, так и обновлений модели, тогда переходы EF могут не быть лучшим инструментом для начала работы, поскольку вы найдете его очень ограничивающим OOTB для этого сценария.

Ответ 2

Я смотрел курс "Основы" на Pluralsight, и это было затронуто. Если у вас есть 3 сайта, Azure возьмет один автономный режим и обновит его, а затем, когда будет готов перезапустить его. В этот момент два других экземпляра будут удалены в автономном режиме, и ваше обновление будет начато, таким образом, ваши изменения схемы.

Когда эти 2 вернутся, EF-миграции уже будут запущены, поэтому ваши сайты вернутся.

В теории все звучит так, как будто она должна работать, хотя в зависимости от того, сколько нужно выполнять миграции EF, запросы могут быть отложены.

Однако комментарий автора заключался в том, что в этом сценарии (т.е. при изменении схемы) вы должны подумать, может ли ваш сайт работать в этой ситуации. Предполагалось, что вам нужно либо заставить ваш код работать как с старыми, так и с новыми схемами или показать "страницу обслуживания вниз".

Резюме похоже, что в зависимости от того, что вы фактически обновляете, это повлияет и повлияет на ваши варианты и способ развертывания.

Ответ 3

Вообще говоря, если вы хотите поддерживать активные обновления, вам необходимо одновременно поддерживать несколько версий приложения. Это действительно единственный способ надежно оставаться активным во время перехода/обновления. Также рассмотрите функции переключателей для масштабирования вашего преобразования контролируемым образом.