Где перезапускать потомков simple_one_for_one?

У меня есть приложение на Erlang, в котором есть simple_one_for_one супервизор, который контролирует набор процессов, отслеживающих изменения на веб-страницах (по одному URL-адресу на каждого ребенка).

Я запускаю детей, которые должны быть активными в поведении моего приложения startпосле добавления соответствующего супервизора в главный супервизор приложения (вместе с некоторыми другими процессами). Затем дочерние элементы запускаются и останавливаются динамически по мере добавления / удаления записей (и записи сохраняются в БД).

Если это simple_one_for_onesupervisor аварийно завершает работу из-за сбоя слишком большого числа его дочерних элементов (например, из-за проблем с сетью), сам диспетчер перезапускается, но его дочерние элементы теряются. На этом этапе я хочу проверить БД и снова запустить дочерние элементы, которые должны быть активными.

Но как мне перезапустить детей? Как я могу узнать, что супервизор перезапустился? Стоит ли планировать запуск детей из собственногоstart_linkфункция? Есть ли лучший способ сделать это?

1 ответ

  1. Измените стратегию перезапуска simple_one_for_one руководитель
#{strategy => simple_one_for_one,
                 intensity => 0,
                 period => 1}
  1. Изменить ребенка (процесс, отслеживающий изменения на веб-страницах) terminate/2 способ
terminate(normal, _State) ->
  %% process terminated normally
  ok;
terminate(_Reason, _State) ->
  %% spawn the child again
  do_supverisor_start_child(),
  ok.

Другие вопросы по тегам