Как безопасно обновить живой сайт
У нас есть довольно простой веб-сайт на основе Django для выполнения операций CRUD. Я проводил тестирование и разработку локально, а затем проверял релизы и изменения схемы базы данных на работающем сервере после завершения тестирования. Недавно мы столкнулись с проблемой при выпуске некоторых типов изменений. Представьте себе следующую последовательность событий:
- Пользователь открывает веб-форму
- Сайт обновлен и требует нового поля в этой форме
- Пользователь отправляет форму, над которой он работал
- Сервер возвращает ошибку, потому что ожидал получить новое поле, добавленное на шаге 2
Как другие сайты решают такие проблемы? Мои идеи:
- Переведите сайт в автономный режим, пока делаются обновления. Это на самом деле не решает проблему, потому что пользователь может иметь веб-форму, открытую в течение неограниченного периода времени, прежде чем отправлять ее, но через некоторое время маловероятно, что кто-либо будет отправлять форму.
- Делайте автоматические обновления при очень низком времени трафика. Опять же, это не решает проблему, но наш сайт не так популярен, и если мы сделаем обновление в 3:00, я сомневаюсь, что будет много пользователей. Одна проблема с этой техникой - автоматические обновления, которые терпят неудачу.
- Версионные формы, так что сервер распознает отправку старой формы и предоставляет более удобный для пользователя ответ. Есть ли автоматизированные инструменты, которые могут помочь с этим?
Мысли?
5 ответов
Изменения в опубликованном API (или в этом случае в пользовательском интерфейсе) всегда непростые. Если возможно, сохраните обратную совместимость. Я полагаю, что для большинства форм функциональность не меняется между версиями. Вы можете добавить или удалить поле или два, но это будет обработано проверкой формы на сервере. По сути, это то, что вы описываете в своем шаге 4. На самом деле я не считаю, что это большая проблема; Ошибки во время выполнения случаются время от времени - пока ваше приложение корректно обрабатывает его и информирует пользователя о проблеме, проблем на самом деле нет.
Если это действительно большая проблема, вы можете включить версию кода в качестве некой скрытой переменной в каждую из ваших форм. Если представленная версия не соответствует текущей запущенной версии приложения, вы можете отобразить правильную ошибку и заставить их заполнить любые новые поля, которые могут существовать в форме. Вы могли бы даже пойти немного дальше и отображать только сообщения, для которых форма изменилась. Возможно, создайте какой-нибудь хэш, основанный на определении формы, и используйте его в качестве скрытого поля. Если хеш неверен, вы знаете, что они отправляют неправильную форму.
Я пользуюсь многими сайтами (предоставленными, в основном внутренними для моего места работы), на которых объявляется что-то вроде: "Мы приедем на ремонт в ближайшие выходные с 18:00 субботы до 6:00 утра воскресенья. Пожалуйста, планируйте быть вне системы в это время." Хотя он не идеален, ничего нет, и это кажется хорошим подходом. Просто выделите достаточно времени, чтобы потушить новый материал, протестируйте его и откатитесь на старый, если это необходимо. Если вы чувствуете, что это необходимо, вы всегда можете создать простую страницу с надписью "Извините, мы не доступны сейчас" и направлять людей к этому в течение простоя. Как правило, никто не будет жаловаться, если вам не нужно все время, которое вы изначально заявили, и вы вернулись рано (возможно, бездельники, которые хотят оправдаться, чтобы уклониться от работы, были бы исключением, но они, вероятно, тогда не работают).
Я не могу понять, как вы могли бы достичь этого, не указав в своей валидации возможность обновления. например. "ожидание" того, что поля могли измениться при отправке и соответственно установка значений по умолчанию / отклонение.
Как насчет "уменьшения" подачи контента по мере приближения окна обслуживания, чтобы минимизировать влияние пользователей на тех, кто оставил свои браузеры открытыми?
"Правильный" способ сделать это - иметь четко определенные представления, которые корректно обрабатывают весь этот класс ошибок. В случае добавления нового поля в вашу модель, которое требуется (я предполагаю, что это то, что происходит), представление должно иметь дело с этим с исключением ValidationError, которое выдает дружественное сообщение об ошибке и отправляет пользователя обратно в форму (которая после перезагрузки должно быть доступно новое поле). Независимо от того, какие поля добавлены в модель, исключение выдаст чистую ошибку и отправит пользователя обратно.