Как я могу восстановить состояние процесса после сбоя?

StackOverflow https://stackoverflow.com/questions/846312

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top