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

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

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

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

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

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


person Community    schedule 10.05.2009    source источник


Ответы (2)


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

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

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

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

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

Во всяком случае, я не вижу проблемы с сохранением состояния в мнезии.

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

person JLarky    schedule 11.05.2009
comment
Супервизор должен содержать как можно меньше логики и отвечать только за перезапуски. Одна ошибка в этой логике может привести к падению целого поддерева. - person Roberto Aloi; 31.08.2012