Во всех примерах супервайзера Erlang, которые я видел еще, обычно есть "главный" супервайзер, который контролирует все дерево (или, по крайней мере, является корневым node в дереве супервизора). Что делать, если "хозяин" -сервизор ломается? Как следует контролировать "хозяина"? любой типичный шаблон?
Эрланг: Кто руководит супервизором?
Ответ 1
Верхний диспетчер запускается в вашем запуске приложения /2 обратного вызова с использованием start_link, это означает, что он связывается с процессом приложения. Если прикладной процесс получает сигнал выхода от верхнего диспетчера, который умирает, он выполняет одну из двух задач:
-
Если приложение запускается как постоянное приложение, весь node я завершается (и, возможно, перезапускается с использованием HEART).
-
Если приложение запущено как временное, приложение перестает работать, попытки перезапуска не будут выполняться.
Ответ 2
Обычно диспетчер настроен на "только" контроль над другими процессами. У какого мужчины нет пользовательского кода, который выполняется Supervisor, поэтому он вряд ли сбой.
Конечно, это не может быть принудительно... Так что типичный шаблон для не имеет какую-либо конкретную прикладную логику в Supervisor... Он должен только контролировать - и ничего не делать.
Ответ 3
Хороший вопрос. Я должен согласиться с тем, что все примеры и руководства в основном игнорируют эту проблему - даже если кто-то упоминает проблему (без предоставления примерного решения):Если вам нужна надежность, используйте как минимум два компьютера, а затем заставляйте их контролировать друг друга. Однако на самом деле реализовать это с помощью OTP (с текущим состоянием документации и учебников), похоже, находится где-то между хорошо скрытым и секретным.