Философия Эрланга о том, что надо терпеть крах - применима в других местах? - PullRequest
54 голосов
/ 09 декабря 2010

Совет Эрланга (или Джо Армстронга?) НЕ использовать защитное программирование и не допускать сбоев процессов (вместо того, чтобы загрязнять ваш код ненужными охранниками, пытающимися отследить обломки)теперь для меня так много смысла, что я удивляюсь, почему я потратил столько времени на обработку ошибок на протяжении многих лет!

Что мне интересно, так это - применим ли этот подход только к таким платформам, как Erlang?У Erlang есть виртуальная машина с простой встроенной поддержкой деревьев контроля процессов, а перезапуск процессов действительно быстрый.Должен ли я тратить свои усилия на разработку (когда не в мире Erlang) на воссоздание деревьев наблюдения, а не навязывание себя обработчиками исключений верхнего уровня, кодами ошибок, нулевыми результатами и т. Д. И т. Д. И т. Д.

Как вы думаете, это изменениеподход будет хорошо работать, скажем, в .NET или Java пространстве?

Ответы [ 6 ]

30 голосов
/ 09 декабря 2010

Это применимо везде .Независимо от того, пишете ли вы свое программное обеспечение по схеме «пусть он падает», оно все равно будет аварийно завершаться, например, при сбое оборудования.«Let it crash» применяется везде, где вам нужно противостоять реальности.Квот Джеймс Гамильтон:

Если аппаратный сбой требует каких-либо немедленных административных действий, сервис просто не будет экономически эффективным и надежным.Вся служба должна быть способна выдерживать сбои без вмешательства администратора.Восстановление после сбоя должно быть очень простым путем, и этот путь должен часто проверяться.Армандо Фокс из Стэнфорда утверждал, что лучший способ проверить путь отказа - это никогда не останавливать службу как обычно.Просто проваливай это.Это звучит нелогично, но если пути сбоев используются не часто, они не будут работать при необходимости.Но не бойтесь разбиться!

24 голосов
/ 10 декабря 2010

Да, это применимо везде, но важно отметить, в каком контексте оно предназначено для использования.Это означает , а не , что означает сбой приложения в целом, которое, как указывал @PeterM, во многих случаях может быть катастрофическим.Цель состоит в том, чтобы создать систему, которая в целом никогда не дает сбоев, но может обрабатывать ошибки внутренне.В нашем случае это были телекоммуникационные системы, которые, как ожидается, будут иметь простои порядка минут в год.

Базовая конструкция состоит в том, чтобы наслоить систему и изолировать центральные части системы для контроля и управления другими частями, которыевыполнять работу.В терминологии OTP мы имеем супервизор и рабочий процессы.У супервайзеров есть функция наблюдения за работниками и другими супервизорами с целью их правильного перезапуска в случае сбоя, когда рабочие выполняют всю фактическую работу.Правильное структурирование системы по уровням с использованием этого принципа строгого разделения функциональных возможностей позволяет изолировать большую часть обработки ошибок от рабочих до супервизоров.Вы пытаетесь получить ядро ​​с ошибкой small , которое в случае ошибки может обрабатывать ошибки в любой части остальной системы.Именно в этом контексте предполагается использовать философию «дай-ей-сбой».

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

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

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

6 голосов
/ 09 декабря 2010

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

С учетом вышесказанного, я думаю, что Erlang должен быть особым случаем, который не только позволяет вам перезапустить вещи мгновенно, что может появиться перезапущенная программа, оглянуться вокруг и сказать: «Аааа… это было то, что я делал!»

5 голосов
/ 09 декабря 2010

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

В ВМС все трубы и электричество монтируются на внешней стороне стены (предпочтительно на более открытой стороне стены). Таким образом, если есть утечка или проблема, более вероятно, что это будет обнаружено быстро. В ВМС людей наказывают за то, что они не реагируют на сбой, поэтому он работает очень хорошо: сбои обнаруживаются быстро и быстро реагируют.

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

4 голосов
/ 14 сентября 2013

Мои коллеги и я подумали над этой темой не особенно с точки зрения технологии, а скорее с точки зрения предметной области и с акцентом на безопасность.

Вопрос в том, "Безопасно ли позволять этому падать?"или лучше: «Можно ли даже применить парадигму надежности, подобную предложенной Эрлангом« пусть рухнет », к программным проектам, связанным с безопасностью?».

Чтобы найти ответ, мы выполнили небольшой исследовательский проект с использованием сценария, близкого к реальности, с промышленным и особенно медицинским образованием.Взгляните сюда (http://bit.ly/Z-Blog_let-it-crash). Есть даже бумага для скачивания. Скажите, что вы думаете!

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

2 голосов
/ 09 декабря 2010

ИМХО Некоторые разработчики обрабатывают / переносят проверенные исключения с помощью кода, который добавляет мало значения. Часто проще разрешить методу генерировать исходное исключение, если вы не собираетесь его обрабатывать и добавлять какое-то значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...