Я пытаюсь создать систему, в которой мне нужно реализовать алгоритм экспоненциального отката. У меня есть контроллер и рабочий. Рабочий — это тот, кто отправляет запрос на определенный URL-адрес и ждет ответа. Контроллер просто назначает задачу свободным работникам. В случае сбоя запроса от работника статус отказа запроса вводится в базу данных.
Чтобы реализовать алгоритм экспоненциальной отсрочки, контроллер должен запускать отдельный поток для выявления неудачных запросов из базы данных. Или есть что-то, что можно сделать на уровне воркера, не задерживая воркера на время повторных попыток?
Во многих случаях внутри воркеров используются повторные попытки с алгоритмами отсрочки. По сути, если контроллер вызывает работника, контроллер просто хочет выполнить работу и повторяет попытку помочь смягчить различные временные проблемы, такие как небольшие проблемы с сетью.
Типичная логика (когда работник вызывается для выполнения задачи):
В конце концов, это будет несколько вызовов отказавшего ресурса с увеличением задержки после каждого отказа.
Константа задержки (some_delay в приведенном выше тексте) выбирается на основе общей архитектуры системы. Как долго контроллер может ждать? Если в какой-то момент истекает время ожидания самого контроллера (или время ожидания клиентов контроллера), то сумма всех интервалов должна быть меньше этого времени ожидания, иначе нет смысла повторять задания, поскольку клиенты все равно не смогут получить результаты.
Еще одна тема, которую следует рассмотреть, — это подход к управлению потоками в вашем приложении. Пока рабочий ожидает следующей попытки, поток будет занят спящим режимом, что может быть проблемой, а может и не быть.
И последний дополнительный момент: если у вас уже есть повторная попытка отсрочки, возможно, имеет смысл рассмотреть возможность добавления шаблона прерывателя цепи; поэтому, если удаленный ресурс недоступен, система не будет тратить время на повторные попытки все время (и задерживать потоки впустую).
Заголовок вашего вопроса спрашивает, как, но тело спрашивает о том, где. Какой из них является вашим настоящим вопросом?