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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top