Где реализовать алгоритм экспоненциального отката в системе контроллер-рабочий?

Я пытаюсь создать систему, в которой мне нужно реализовать алгоритм экспоненциального отката. У меня есть контроллер и рабочий. Рабочий — это тот, кто отправляет запрос на определенный URL-адрес и ждет ответа. Контроллер просто назначает задачу свободным работникам. В случае сбоя запроса от работника статус отказа запроса вводится в базу данных.

Чтобы реализовать алгоритм экспоненциальной отсрочки, контроллер должен запускать отдельный поток для выявления неудачных запросов из базы данных. Или есть что-то, что можно сделать на уровне воркера, не задерживая воркера на время повторных попыток?

Заголовок вашего вопроса спрашивает, как, но тело спрашивает о том, где. Какой из них является вашим настоящим вопросом?

Peter Csala 07.12.2022 08:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Типичная логика (когда работник вызывается для выполнения задачи):

  1. перед вызовом запроса worker создает счетчик C с начальным значением, равным нулю; и устанавливает значение максимального количества попыток в качестве конфигурации, например. 3
  2. рабочий ожидает время C*some_delay; где some_delay — интервал, настроенный вручную (подробнее об этом позже)
  3. работник делает запрос
  4. если запрос терпит неудачу, рабочий проверяет, все ли попытки выполнены, и если это так, ошибка отправляется обратно контроллеру; в противном случае C увеличивается, и рабочий переходит к шагу 2.

В конце концов, это будет несколько вызовов отказавшего ресурса с увеличением задержки после каждого отказа.

Константа задержки (some_delay в приведенном выше тексте) выбирается на основе общей архитектуры системы. Как долго контроллер может ждать? Если в какой-то момент истекает время ожидания самого контроллера (или время ожидания клиентов контроллера), то сумма всех интервалов должна быть меньше этого времени ожидания, иначе нет смысла повторять задания, поскольку клиенты все равно не смогут получить результаты.

Еще одна тема, которую следует рассмотреть, — это подход к управлению потоками в вашем приложении. Пока рабочий ожидает следующей попытки, поток будет занят спящим режимом, что может быть проблемой, а может и не быть.

И последний дополнительный момент: если у вас уже есть повторная попытка отсрочки, возможно, имеет смысл рассмотреть возможность добавления шаблона прерывателя цепи; поэтому, если удаленный ресурс недоступен, система не будет тратить время на повторные попытки все время (и задерживать потоки впустую).

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