У нас есть веб-приложение asp.net с сервером sql, которое развернуто на ферме серверов с объединенными базами данных. Мы используем хранимые процедуры (в отличие от подготовленных операторов SQL) и сеансы inproc. В рамках достижения высокой доступности (по крайней мере для пакетов обновления с контролируемым набором изменений) мы намерены использовать развертывание в ферме, что означает, что мы делаем это:
- Завершение работы группы серверов
- Развернуть приложение на этих серверах
- Откройте эти серверы
- Закройте другую группу. Повторите 1-3 для всех групп.
Хотя это может означать, что некоторые пользователи будут отключены, приложение все еще доступно, и страница поддержки не требуется.
Легкая часть заключается в развертывании веб-приложения, но более сложная часть заключается в том, что в хранимой процедуре есть изменения (например, добавлен новый параметр). Будет момент, когда потребуется обе версии хранимой процедуры (существующая и новая развертываемая).
Мы рассмотрели 4 варианта хранимых процедур:
- Не используйте скользящие развертывания, если в выпуске есть изменение хранимой процедуры
- Если в выпуске используется непрерывное развертывание, разрешены только новые хранимые процедуры, даже если это означает дублирование кода
- Ввести версионность хранимых процедур и некоторые компоненты инфраструктуры на уровне приложения для автоматического добавления номера версии к вызываемому sproc.
- Перезаписать существующую хранимую процедуру и разрешить некоторые вызовы хранимой процедуры.
У всех подходов есть свои плюсы и минусы, и эти 3) являются наиболее жизнеспособными, но и наиболее сложными.
Какой из них вы бы порекомендовали? Есть ли какие-либо хитрости в SQL Server для обработки этого сценария? Есть ли другие подходы?