Эрланг приходит из другой культуры, думая о надежности и способах ее достижения. Понимание культуры важно, так как код Erlang не становится отказоустойчивым благодаря магии только потому, что это Erlang.
Фундаментальная идея заключается в том, что высокое время безотказной работы происходит не только из-за очень большого среднего времени между сбоями, но также из-за очень короткого среднего времени восстановления после сбоя.
Затем вы понимаете, что нужно автоматически перезапускаться при обнаружении сбоя. И кто-то понимает, что при первом обнаружении чего-то не совсем правильного следует «сбиться», чтобы вызвать перезапуск. Восстановление должно быть оптимизировано, а возможные потери информации должны быть минимальными.
За этой стратегией следуют многие успешные программы, такие как журнальные файловые системы или базы данных журналов транзакций. Но в подавляющем большинстве случаев программное обеспечение обычно учитывает только среднее время между сбоями и отправляет в системный журнал сообщения об ошибках, а затем пытается продолжать работу до тех пор, пока это станет невозможным. Обычно требуется, чтобы система контролировалась человеком и выполнялась перезагрузка вручную.
Большинство из этих стратегий в форме библиотек в Erlang. Часть, которая является языковой особенностью, состоит в том, что процессы могут «связывать» и «контролировать» друг друга. Первый - это двунаправленный контракт, который «если вы терпите крах, то я получаю ваше сообщение о сбое, которое, если не попадет в ловушку, сломает меня», а второе - «если вы терпите крах, я получаю сообщение об этом».
Связывание и мониторинг - это механизмы, которые используются библиотеками, чтобы убедиться, что другие процессы не завершились (пока). Процессы организованы в «деревья наблюдения». В случае сбоя рабочего процесса в дереве супервизор попытается перезапустить его или всех рабочих на том же уровне этой ветви в дереве. Если это не удастся, оно будет увеличиваться и т. Д. Если супервизор верхнего уровня прекращает работу приложения, а виртуальная машина завершает работу, после чего системный оператор должен перезагрузить компьютер.
Полная изоляция между кучами процессов - еще одна причина, по которой Эрланг хорошо себя чувствует. За немногими исключениями невозможно «разделить ценности» между процессами. Это означает, что все процессы очень автономны и часто не подвержены сбою другого процесса. Это свойство также сохраняется между узлами в кластере Erlang, поэтому маловероятно обрабатывать сбой узла из кластера. Реплицируйте и отправляйте события изменений, а не используйте одну точку отказа.
Философии, принятые Эрлангом, имеют много названий: «быстрый отказ», «система только при сбое», «ориентированное на восстановление программирование», «выявление ошибок», «микро-перезапуск», «репликация», ...