Как стать автором
Обновить

Комментарии 10

К сожалению принцип fail fast понимается так что падать надо действительно сразу, даже не озаботившись сбором сведений о текущем состоянии и формировании информативных сообщениях об ошибке.
Поэтому следование этому принципу порождает «дома с привидениями» — вроде работает, но вдруг пятницу 31-го чётного года падает — и не понятно почему (реальный случай!). И хрен докопаешься без целого квеста с тупиками и разветвлениями.
Так что «по-умолчанию» всё же препочтительнее fail safe (естественно с записями в лог, предупреждениями и т.п. — иначе это будет ignore) — именно так, например, работает javascript в браузерах. Падает, но оставляет следы в логе.

Я резюмировал из статьи так: На проде fail safe, до прода - fail fast. С моим опытом вполне согласуется.

Мой опыт подсказывает мне, что при подготовке к проду никто не будет переделовать все блоки try-catch, все лесенки if-else и/или switch обработки ошибок. Очень, очень редко кто заморачивается хоть что-то поправить — хоть в одном месте.
Так что — особенно для небольших команд — у меня правило: пишем сразу как в прод («сразу пишем хорошо» :) ). Иначе в прод отправляется «прототип» как он есть.

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

На этапе разработки, падение приложения, конечно, предпочтительнее. Тестировщик сразу лезет в логи и заводит багу на разработчика. В этом и смысл fail-fast! В продакшене же, конечно, приложение не должно упасть. Оно должно собрать все данные об ошибке, отправить их куда надо, а пользователю вывести сообщение, что данная фича сейчас недоступна. Короче говоря, fail-safe! - это fail-fast! + бизнес-обёртка для минимизации ущерба.

Почему же, fail-fast! - это, в первую очередь, о системе, которая останавливает свою работу при возникновении ошибки, с прекращением всякой бизнес-логики. И не более. Обработка ошибки с последующим логированием стектрейса, возвращением негативного HTTP-статуса и прочей фиксацией ошибки могут быть заложены при прекращении бизнес-логики на системном уровне (тот самый случай "громкого падения"). При этом, бизнес-логика при негативном сценарии не осуществляется.

Принцип же fail-safe! подразумевает именно бизнес-логику при негативном сценарии. В этом и их различие.

Приведу пример. Клиент стучится на сервер за данными и не получает их. При реализации fail-fast! на экране пользователя возникает сообщение об ошибке, что-то вроде "HTTP Status 500: java.util.NoSuchElementException: Document not found..." и так далее. При этом, приложение упало как можно громче, с логами, аварийными записями в базу и так далее - но оно именно упало и больше ничего. Пользователь видит сообщение, морщится, но ничего, стерпит.

В случае же применения fail-safe! произойдёт такое же громкое падение с логами и прочим, но на клиент будет возвращено сообщение: "Спокойно, нет поводов для паники, мы не можем отыскать сервер, но обязательно его отыщем! Приходите завтра." Во втором случае, в негативный сценарий заложена дополнительная бизнес-логика, которая призвана сгладить пользователю негативный эффект.

А так, конечно, Вы правы - приложение должно падать как можно громче, причём, всегда.

В эру кубернетиса и облаков надо как можно быстрее упасть чтобы соседи перехватили знамя и понесли дальше. Я бы даже советовал выделять ресурсов по-минимуму чтобы при малейшем признаке фатала приложение завершалось и кубернетис перестартовал всё что можно.

Для клиентских приложений конечно можно и похромать какое-то время, чисто чтобы юзер сохранил данные. Но сколько осталось тех клиентских? Даже фотошоп в облаке.

Не кубером единым жив мир.

Согласитесь, потеря документа, над которым вы работаете на локальном компьютере - это плохо.

Да даже проще: у вас из-за ошибки разметки на любой странице или в скрипте шустро рестартует браузер в состоянии "с чистого листа" или хотя бы как он был при последнем ручном закрытии (ну, сохраняем конфиг не постоянно, а по фиксированному событию).

Для клиентских приложений конечно можно и похромать какое-то время, чисто чтобы юзер сохранил данные.

И сохранить сломанные данные, чтобы при загрузке этого битого файла упасть окончательно?

Не всё так однозначно (с)

Хм.
А как быть с таким вот случаем:

Подключились к серверу через сокет

Послали запрос. Все ок.

Получили ответ. Тоже все ок.
Шлем следующий.

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

О. Или вообще. Мы сервер. К нам подключились. Все нормально, начали сессию. Вот, пробуем читать - у клиента вырубили свет, мы получили 10054. Чего делать? Паниковать и падать? Или просто обработать это, закрыть сессию и обслуживать других клиентов?

Ну. Просто я не знаю. Если на каждую ошибку падать - как-то не очень круто это будет.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории