У меня есть несколько gen_server
рабочих, которые периодически запрашивают некоторую информацию от аппаратных датчиков. Датчики могут временно выйти из строя, это нормально. Если датчик выходит из строя, рабочий завершает работу с исключением.
Все рабочие порождаются из супервизора со стратегией simple_one_to_one
. Также у меня есть элемент управления gen_server
, который может запускать и останавливать воркеры, а также принимает 'DOWN'
сообщения.
Итак, теперь у меня две проблемы:
Если рабочий перезапускается супервизором, его состояние теряется, что для меня неприемлемо. Мне нужно воссоздать работника с таким же состоянием.
Если рабочий выходит из строя несколько раз за определенный период времени, то с датчиками произошло серьезное событие, требующее внимания оператора. Таким образом, мне нужно отказаться от перезапуска воркера и отправить сообщение обработчикам событий. Но поведение супервизора по умолчанию прекращается после ограничения перезапуска процесса исчерпания.
Я вижу два решения:
Установите тип процессов в супервизоре как временный, контролируйте их и перезапускайте в контроле
gen_server
. Но это именно то, что должен делать руководитель, поэтому я изобретаю велосипед.Создайте супервизора для каждого работника под главным супервизором. Это точно решает мою вторую проблему, но состояние рабочих теряется после перезапуска, поэтому мне нужно какое-то хранилище, такое как таблица ets, хранящая состояния рабочих.
Я новичок в Erlang, поэтому мне нужен совет по моей проблеме, какое (если есть) решение является лучшим. Заранее спасибо.