Pergunta

O que é uma boa maneira de persistir o estado ao reiniciar um processo caiu?

Eu tenho um supervisor em um aplicativo OTP que assiste vários gen_servers "subsistema".

Por exemplo, é um subsistema de "tempo" que gera um novo estado de tempo a cada 15 minutos e lida com consultas para o estado atual do tempo. (Acho que o jogo limonada)

Se esse crashes gen_server, eu quero que ele seja reiniciado, mas deve-se ser reiniciado com o estado de tempo mais recente, não um estado arbitrário codificado em init(). Não faria sentido para o Estado de simulação, de repente, ir de "tempestade de granizo" para "agradável e alegre" apenas por causa do acidente.

Eu hesito em usar mnesia ou ETS para armazenar o estado depois de cada atualização por causa da complexidade; há uma maneira mais fácil?

Foi útil?

Solução

Enquanto ele só tem que ser durante a execução de um gostaria de sugerir o uso de ETS. O valor é de longe maior do que a complexidade. A API é simples e se você estiver trabalhando com tabelas nomeadas o acesso é muito simples. Você só tem que criar a tabela antes de seu gen_server é iniciado pelo supervisor.

Two - mais complexas - alternativas:

  • construir um par de processos, um para o trabalho a fazer, um para a manutenção do estado. Devido à simplicidade do segundo seria muito confiável.
  • A um bobo real pode ser a troca da especificação filho do supervisor com o estado atual como argumento cada vez que o estado está mudando. (sorriso) Não, estou brincando.

Outras dicas

Existe uma maneira mais fácil?

quando o processo morreu ele envia mensagem para supervisor que contém Estado do processo, de modo que você pode usar esse valor para loja no supervisor (em mnesia ou estado de supervisor) e quando o servidor será iniciado (em init ) ele tem que enviar chamada de sincronização ao supervisor para obter o valor Estado. Eu tenho exemplo não é real, mas eu espero que isso faz sentido.

De qualquer forma eu realmente não vejo problema de Estado loja em mnesia.

desculpe o meu Inglês:)

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