Перейти к содержанию

Отложенная обработка

Зачем нужна отложенная обработка

При параллельной доставке сообщения поступают в локальную очередь одновременно и обрабатываются в произвольном порядке. Для независимых объектов это нормально. Но если объект B ссылается на объект A, а A ещё не обработан, обработчик B не найдёт A в локальной базе.

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

Жизненный цикл сообщения в локальной очереди

flowchart LR
    A([Получено]) --> B[Ожидание\nобработки]
    B --> C[В обработке]
    C -- Успех --> D([Обработано])
    C -- Ошибка --> E{Попыток\n> max?}
    E -- Нет --> B
    E -- Да --> F([Ошибка\nобработки])

Параметры повторной обработки (типовые значения, настраиваются в модуле):

Параметр Значение по умолчанию
Задержка между попытками 30 секунд
Максимальное число попыток 5

При исчерпании попыток сообщение переходит в статус «Ошибка обработки» и требует ручного вмешательства.

Управление задержкой из обработчика

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

Идемпотентность

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

Подробнее — в Концепции / Идемпотентность.