Супервайзер Erlang. Перезапуск процесса, если он не удался несколько раз, откажитесь и отправьте сообщение

У меня есть несколько gen_server рабочих, которые периодически запрашивают некоторую информацию от аппаратных датчиков. Датчики могут временно выйти из строя, это нормально. Если датчик выходит из строя, рабочий завершает работу с исключением.

Все рабочие порождаются из супервизора со стратегией simple_one_to_one. Также у меня есть элемент управления gen_server, который может запускать и останавливать воркеры, а также принимает 'DOWN' сообщения.

Итак, теперь у меня две проблемы:

  1. Если рабочий перезапускается супервизором, его состояние теряется, что для меня неприемлемо. Мне нужно воссоздать работника с таким же состоянием.

  2. Если рабочий выходит из строя несколько раз за определенный период времени, то с датчиками произошло серьезное событие, требующее внимания оператора. Таким образом, мне нужно отказаться от перезапуска воркера и отправить сообщение обработчикам событий. Но поведение супервизора по умолчанию прекращается после ограничения перезапуска процесса исчерпания.

Я вижу два решения:

  1. Установите тип процессов в супервизоре как временный, контролируйте их и перезапускайте в контроле gen_server. Но это именно то, что должен делать руководитель, поэтому я изобретаю велосипед.

  2. Создайте супервизора для каждого работника под главным супервизором. Это точно решает мою вторую проблему, но состояние рабочих теряется после перезапуска, поэтому мне нужно какое-то хранилище, такое как таблица ets, хранящая состояния рабочих.

Я новичок в Erlang, поэтому мне нужен совет по моей проблеме, какое (если есть) решение является лучшим. Заранее спасибо.


person galadog    schedule 24.03.2012    source источник
comment
Эта ветка ответит на большинство ваших вопросов. Обычно супервизор не сохраняет состояния поведения, вам придется позаботиться об этом самостоятельно. stackoverflow.com/questions/6881075/   -  person Abhinav Singh    schedule 28.03.2012


Ответы (1)


Если рабочий перезапускается супервизором, его состояние теряется, что мне не доступно. Мне нужно воссоздать воркера с таким же состоянием.

Если вам нужно состояние процесса для сохранения жизненного цикла процесса, вам нужно сохранить его в другом месте, например, в таблице ETS.

Если рабочий выходит из строя несколько раз в течение определенного времени, то с датчиками произошло серьезное событие, требующее внимания оператора. Таким образом, мне нужно отказаться от перезапуска воркера и отправить сообщение обработчикам событий. Но поведение супервизора по умолчанию прекращается после ограничения перезапуска процесса исчерпания.

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

person Roberto Aloi    schedule 28.03.2012
comment
Спасибо за ваш ответ. Примерно что-то подобное я реализовал. Теперь у меня есть два уровня супервизоров, таким образом, у каждого рабочего есть свой выделенный супервизор, и, если работник не может часто посещать его, его супервизор умирает и отправляет сообщение «ВНИЗ» на управляющий сервер. И все рабочие сохраняют важную информацию в таблице ETS. Спасибо Вам большое! - person galadog; 31.03.2012