I like option 3 here:
But with the part of handling a failure, I would put in a sleep
# Unexpected failure
def handle_info({:DOWN, ref, :process, _pid, _reason}, %{ref: ref} = state) do
:timer.sleep(3000)
# restart the task
task = do_start_task()
{:noreply, %{state | ref: task.ref}}
end


















