Эрланг руководитель.Процесс перезапуска, если он несколько раз завершился неудачей, сдаться и отправить сообщение - PullRequest
2 голосов
/ 24 марта 2012

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

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

Так что теперь у меня есть две проблемы:

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

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

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

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

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

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

1 Ответ

2 голосов
/ 28 марта 2012

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

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

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

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

...