Где перезапускать потомков simple_one_for_one?
У меня есть приложение на Erlang, в котором есть simple_one_for_one
супервизор, который контролирует набор процессов, отслеживающих изменения на веб-страницах (по одному URL-адресу на каждого ребенка).
Я запускаю детей, которые должны быть активными в поведении моего приложения start
после добавления соответствующего супервизора в главный супервизор приложения (вместе с некоторыми другими процессами). Затем дочерние элементы запускаются и останавливаются динамически по мере добавления / удаления записей (и записи сохраняются в БД).
Если это simple_one_for_one
supervisor аварийно завершает работу из-за сбоя слишком большого числа его дочерних элементов (например, из-за проблем с сетью), сам диспетчер перезапускается, но его дочерние элементы теряются. На этом этапе я хочу проверить БД и снова запустить дочерние элементы, которые должны быть активными.
Но как мне перезапустить детей? Как я могу узнать, что супервизор перезапустился? Стоит ли планировать запуск детей из собственногоstart_link
функция? Есть ли лучший способ сделать это?
1 ответ
- Измените стратегию перезапуска
simple_one_for_one
руководитель
#{strategy => simple_one_for_one,
intensity => 0,
period => 1}
- Изменить ребенка (процесс, отслеживающий изменения на веб-страницах)
terminate/2
способ
terminate(normal, _State) ->
%% process terminated normally
ok;
terminate(_Reason, _State) ->
%% spawn the child again
do_supverisor_start_child(),
ok.