Как супервизор контролирует процессы? Можно ли сделать то же самое на JVM?

Отказоустойчивость Erlang (насколько я понимаю) включает использование процессов супервизора для наблюдения за рабочими процессами, поэтому, если работник умирает, супервизор может запустить новый.

Как Erlang осуществляет этот мониторинг, особенно в распределенном сценарии? Как можно быть уверенным, что процесс действительно умер? Это сердце бьется? Что-то встроено в среду выполнения? Что, если сетевой кабель отключен - предполагается ли, что другие процессы умерли, если он не может связаться с ними? и т.п.

Я думал о том, как добиться такой же отказоустойчивости и т. Д., Как утверждал Эрланг в JVM (скажем, на Java или Scala). Но я не был уверен, что для этого потребуется поддержка, встроенная в JVM, а также Erlang. Я еще не нашел определения того, как Эрланг это делает, хотя для сравнения.

4 ответа

Решение

Erlang OTP Supervision обычно не выполняется между процессами на разных узлах. Это бы сработало, но лучше всего делать это по-другому.

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

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

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

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

Я думаю, вы подразумеваете под супервизором процесс portmapper. Вы можете использовать портмейпер / инфраструктуру Erlang через JInterface - таким образом, вы не будете изобретать велосипед заново - на случай, если вы все-таки захотите его, вы получите по крайней мере все интерфейсы, описанные там.

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

Как Erlang осуществляет этот мониторинг, особенно в распределенном сценарии? Как можно быть уверенным, что процесс действительно умер? Это сердце бьется? Что-то встроено в среду выполнения?

Я считаю, что это сделано во время выполнения BEAM. Когда процесс умирает, сигнал отправляется всем связанным с ним процессам. См. Главу 9 Программирование Erlang для полного обсуждения.

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

В Erlang вы можете контролировать узел и получать {node_up, Node} а также {node_down, Node} Сообщения. Я предполагаю, что они также будут отправлены, если вы больше не можете общаться с узлом. Как вы справляетесь с ними, зависит от вас.

Другие вопросы по тегам