Как я могу восстановить состояние процесса после сбоя? - PullRequest
7 голосов
/ 11 мая 2009

Какой хороший способ сохранить состояние при перезапуске сбойного процесса?

У меня есть супервизор в приложении OTP, который наблюдает за несколькими "подсистемами" gen_servers.

Например, одна из них - это подсистема «погода», которая генерирует новое состояние погоды каждые 15 минут и обрабатывает запросы для текущего состояния погоды. (Вспомните игру с лимонадом)

Если сбой этого gen_server, я хочу, чтобы он был перезапущен, но он должен быть перезапущен с последним погодным состоянием, а не с произвольным состоянием, жестко заданным в init(). Для состояния симуляции не имеет смысла внезапно переходить от «града» к «приятному и свежему» только из-за аварии.

Я не решаюсь использовать mnesia или ETS для хранения состояния после каждого обновления из-за дополнительной сложности; Есть ли более простой способ?

Ответы [ 2 ]

4 голосов
/ 11 мая 2009

Пока это только должно быть во время выполнения, можно предположить использование ETS. Значение намного больше, чем сложность. API прост, и если вы работаете с именованными таблицами, доступ также прост. Вам нужно только создать таблицу, прежде чем ваш gen_server будет запущен супервизором.

Два - более сложные - альтернативы:

  • Создайте пару процессов, один для работы, другой для поддержки состояния. Из-за простоты второго он будет действительно надежным.
  • Действительно глупым может быть обмен дочерней спецификацией супервизора с текущим состоянием в качестве аргумента при каждом изменении состояния. (улыбается) Нет, просто шучу.
2 голосов
/ 11 мая 2009

Есть ли более простой способ?

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

В любом случае, я не вижу проблемы с хранением State в mnesia.

извините, мой английский:)

...