Как перезапустить сбой контролируемого процесса через определенное время?

У меня есть простое приложение на основе GenServer, которое анализирует веб-страницу и воспроизводит данные, полученные с нее. Код выглядит примерно так:

def start_link do
  GenServer.start_link(__MODULE__, %{})
end

def init(state) do
  schedule_work(1)
  {:ok, state}
end

def handle_info(:work, state) do
  // Request webpage using HTTPoisson
  // Parse data using Floki
  // Use it

  schedule_work(10 * 60) # Reschedule after 10 minutes
  {:noreply, state}
end

defp schedule_work(timeout) do
  Process.send_after(self(), :work, timeout * 1000)
end

Сегодня сторонний сайт на какое-то время перестал доставлять правильную разметку, и при синтаксическом анализе произошел сбой GenServer. Супервизор перезапустил его, и он сразу разбился. После :max_restarts Супервизор в конце концов остановил приложение.

Я не хочу просто увеличить :max_restarts, Есть ли способ сообщить Supervisor о попытке перезагрузки через определенное время? Или я должен сделать больше обработки ошибок в моем коде синтаксического анализа, чтобы предотвратить сбои процесса во-первых (я предполагаю, что это будет противоречить философии "Let it crash")?

1 ответ

Я бы сказал, что лучше всего как лучше обрабатывать ошибки, так и лучше.

Вы упомянули, что не хотите просто увеличивать max_restarts вариант. Вы могли бы альтернативно снизить max_seconds опция, которая по умолчанию 5.

Кроме того, вы можете ловить выходы с Process.flag(:trap_exit, true) и, в случае ошибок синтаксического анализа, выйти с конкретным сообщением (например, Process.exit(pid, :bad_parsing) и использовать это, чтобы перенести. Это может потребовать небольших изменений здесь и там в том, как вы контролируете вещи, хотя.

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