1

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

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

UPDATE:

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

Вариант 1

  1. Deploy для DC
  2. код первой миграции работает на централизованной БД
  3. запросы, сделанные DC A успешно, но запросы к DC B неудачу

Вариант 2

  1. Развернуть до DC A
  2. Не запускается автоматически миграциям
  3. запросов, сделанных в DC неисправность и запросы к DC B продолжает преуспевать

Как разработать стратегию развертывания, которая будет делать это так, чтобы запросы либо DC будет работать ?

BTW: Я использую Azure Web Sites, если требуется решение для конкретной платформы.

+0

«работает на централизованной БД». Миграции применяются к базе данных, а не к экземпляру приложения. Если ваша схема изменилась, вам потребуется развернуть обновленный код для каждого приложения, но вам не нужно выполнять миграцию для каждого. Миграция применяется только к централизованной базе данных. – AaronLS

+0

Кроме того, я считаю, что EF проверяет версию БД и терпит неудачу, если ее версия отличается (это было пару версий назад, но я знаю, что они избавились от некоторых таблиц метаданных миграции). Таким образом, ваш второй экземпляр приложения просто бросает ошибки для любых запросов, сделанных для него во время развертывания обновленного экземпляра, который обычно довольно быстрый. Вы можете проверить это и определить точное исключение и ловушку этого исключения и отправить пользователям сообщение «обновление сайта» или попытаться направить их в другой экземпляр, если у вас есть эта возможность. – AaronLS

+0

Да, вы ударили его по голове. Я могу полностью вернуть ошибки или сообщение «обновление сайта», но похоже, что должно быть решение для прокачки обновлений, где вы проверяете сайт на ограниченном количестве серверов, прежде чем отправлять его остальным. –

ответ

1

В вашем посте вам показалось, что вы обеспокоены тем, как он будет себя вести во время фактического обновления. Ничего о тестировании. Но в комментариях вы просите о частичном развертывании, затем выполните тестирование. Поэтому, с одной стороны, вы бы хотели как можно быстрее развернуть, чтобы минимизировать время простоя. С другой стороны, похоже, что вы хотите развернуть на один сайт, протестировать и продолжать работать другие сайты, пока вы проверяете первое развертывание?
Проверка развертывания разумная, но довольно сложная. Я не уверен, что вы найдете много способов автоматизации для этого. Я думаю, что вы должны тщательно протестировать его до развертывания, а затем просто развертывать как можно быстрее в процессе производства. Если возникла проблема, которую вы обнаружили только при развертывании на производстве, вы столкнулись бы в плохом состоянии, потому что теперь ваш сайт не работает, пока вы не сможете его исправить. Даже если вы могли бы заставить другой экземпляр работать с новой базой данных, это рискованно, поскольку он будет изменять действия против схемы, которые он не понимает полностью. Кроме того, если вам нужно откат DDL, вы почти наверняка потеряете все данные, которые были изменены с момента развертывания. Поэтому лучше всего, чтобы все экземпляры старой схемы завершились с ошибкой до тех пор, пока они не были обновлены, чтобы предотвратить их изменение данных, которые могут быть потеряны.

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

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

+0

Тестирование - это лишь один пример того, как используются обновляемые обновления. Microsoft делает это для Outlook.com, Bing и т. Д. Это проверка на конфиденциальность в последнюю минуту, поэтому вы не затрагиваете всех, если что-то не было учтено в процессе производства. Они говорят об этом [здесь] (http://msdn.microsoft.com/en-us/library/jj717232.aspx). –

+1

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

+1

Я думаю, что скользящие обновления в контексте статей Azure просто касаются изменений в приложении в отдельных случаях. Это звучит потрясающе, пока вы не рассматриваете централизованную БД, которая имеет частые изменения схемы. Я нахожу много таких функций, которые не выдерживают реальных проблем в мире. У Outlook, вероятно, их база данных сильно разделена, поэтому они могут обновлять один экземпляр базы данных, одновременно обновляя набор серверов для этого конкретного экземпляра базы данных и оставляя другие экземпляры/серверы db нетронутыми. – AaronLS

Смежные вопросы