Dmitriy Kononov.
Обсудим задачуСвязаться

Новости и разборы

Фоновые задания: как повторять обработку без повторного результата

Очереди, retries и идемпотентность: как проектировать фоновые операции, контролировать задержки и разбирать задания, которые не удалось выполнить.

ИнфраструктураОпубликовано:

Повторная попытка может восстановить процесс после краткого сбоя. Она также может второй раз отправить документ или создать дублирующую запись. У очереди фоновых заданий поэтому две разные задачи: довести работу до результата и удержать повторную обработку в согласованных границах. Решение требуется ещё до выбора библиотеки очередей.

Начать с результата, который видит человек

У фоновой операции должен быть понятный контракт. Что означает принятие задания? Когда результат доступен? Как пользователь узнает о задержке или окончательной ошибке? Если интерфейс сообщает об успешной отправке документа сразу после помещения задания в очередь, он может обещать действие, которого ещё не произошло.

Полезно разделить состояния: принято, выполняется, завершено и требует вмешательства. Число и названия состояний зависят от процесса. Важнее, чтобы команда могла определить текущий результат и ответственное действие. Для критичного процесса нужна также связь с исходной заявкой или документом.

Почему сообщение может прийти повторно

Стандартные очереди Amazon SQS используют доставку как минимум один раз, поэтому обработчик должен учитывать возможный повтор. Это конкретный пример контракта доставки; свойства выбранной очереди следует проверить отдельно. Но даже при других гарантиях остаётся вопрос внешних действий и неоднозначного результата запроса.

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

Идемпотентность означает, что повтор одного действия не создаёт дополнительный ожидаемый эффект. Ключ лучше привязывать к бизнес-операции, а не выдавать новый при каждом запуске обработчика. Однако сам ключ не защищает от всех дублей: нужно сохранять состояние, проверять соответствие входных данных и учитывать параллельную обработку.

Какие ошибки стоит повторять

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

Между попытками нужна управляемая пауза. При массовом сбое одновременный повтор множества задач может увеличить нагрузку на уже недоступный компонент. Подход выбирают по ограничению поставщика, сроку выполнения и объёму очереди. Конкретное число повторов не следует устанавливать одинаковым для платежа, отчёта и обновления справочника.

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

Неудачные задания должны иметь владельца

Dead-letter queue в SQS помогает выделять сообщения, обработка которых не завершилась успешно. Перенос в такую очередь ещё не означает исправление проблемы. Нужны уведомление, диагностика, ответственный и контролируемый возврат в обработку.

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

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

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

Я связываю этот вопрос с работой над Dent-Picks, где разработал серверную логику и синхронизации между системами. После входящего звонка на IVR автоматически создаётся лид в GoHighLevel. Такой переход даёт понятный предмет приёмки: команда должна получить запись для дальнейшей работы. Описание проекта не устанавливает используемую очередь или гарантии повторной обработки; их нужно проверять в конкретной реализации.

Подробнее о постановке этих требований я пишу в материале о документах, CRM и задачах. Там разобраны идентификатор заявки, повтор после таймаута и видимость неудачного перехода. Это удобная основа для разговора о фоновой работе ещё до выбора библиотеки и инфраструктуры очередей.

Источники

Источники проверены 7 октября 2026 года.