Reiniciando automaticamente os aplicativos Erlang
-
27-09-2019 - |
Pergunta
Recentemente, encontrei um bug onde um aplicativo Erlang inteiro morreu, produzindo uma mensagem de log que parecia esta:
=INFO REPORT==== 11-Jun-2010::11:07:25 ===
application: myapp
exited: shutdown
type: temporary
Não tenho idéia do que desencadeou esse desligamento, mas o verdadeiro problema que tenho é que ele não se reinicia. Em vez disso, a agora vazia Erlang VM ficou lá não fazendo nada.
Agora, a partir da pesquisa que já fiz, parece que existem outros "tipos de início" que você pode fazer um aplicativo: 'transitório' e 'permanente'.
Se eu começar um supervisor dentro de um aplicativo, posso dizer para fazer um processo particular transitório ou permanente, e ele o reiniciará automaticamente para mim. No entanto, de acordo com a documentação, se eu fizer um inscrição transitório ou permanente, não o reinicia quando morre, mas mata tudo o outro Aplicações também.
O que eu realmente quero fazer é dizer à Erlang VM que um aplicativo específico deve sempre estar em execução e, se cair, reinicie -o. Isso é possível fazer?
(Não estou falando sobre a implementação de um supervisor no topo do meu aplicativo, porque então é uma captura 22: e se meu processo de supervisor falhar? Estou procurando algum tipo de API ou configuração que eu possa usar para ter o monitor Erlang e reinicie minha aplicação para mim.)
Obrigado!
Solução
Você poderá consertar isso no supervisor de nível superior: defina a estratégia de reinicialização para permitir um milhão de reinicializações a cada segundo, e o aplicativo nunca deve travar. Algo como:
init(_Args) -> {ok, {{one_for_one, 1000000, 1}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}.
(Exemplo adaptado do Guia do usuário de princípios de design OTP.)
Outras dicas
Você pode usar coração Para reiniciar a VM inteira, se ele cair, use um tipo de aplicativo permanente para garantir que a VM saia quando o aplicativo sair.
Por fim, você precisa de algo acima do seu aplicativo em que você precisa confiar, seja um processo de supervisor, a VM Erlang ou algum script de shell que você escreveu - sempre será um problema se isso também falhar.
Use Monit e configure seu aplicativo para rescindir usando um supervisor para todo o aplicativo com uma frequência de reinicialização razoável. Se o aplicativo terminar, a VM termina e o Monit reiniciar tudo.
Eu nunca conseguia que o coração seja confiável o suficiente, pois apenas reinicia a VM uma vez, e isso não lida bem com uma matança -9 da Erlang VM.