Как перезапустить сбой контролируемого процесса через определенное время?
У меня есть простое приложение на основе 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)
и использовать это, чтобы перенести. Это может потребовать небольших изменений здесь и там в том, как вы контролируете вещи, хотя.