Вернуться к документации

Повторы и идемпотентность

Автоматические HTTP-попытки, независимые получатели и два разных механизма защиты от дублей.

Открыть как Markdown
На этой странице

Что повторяется

В Inbound автоматические попытки относятся к доставке конкретному Ендпоинту; в Outbound — к исполнению самостоятельного задания. Сбой одного получателя не означает, что остальные должны получить новую доставку.

Успех и ошибка

Успех требует HTTP-ответа 2xx без ошибки исполнения. Сетевой сбой, таймаут, ошибка чтения или иной HTTP-статус означают неуспешную попытку. Для Outbound чтение ответа должно завершиться корректно даже при выключенном сохранении его тела. Ответ 202 API Adal говорит только о приёме задания.

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

Автоматические попытки

CLI, Direct и самостоятельный Outbound допускают до 10 HTTP-попыток, включая первую. Первая начинается без дополнительной паузы повторов, когда исполнителю доступна работа. Таймаут HTTP-попытки — 30 секунд, включая чтение ответа. Это не обещание начать или завершить задание через 30 секунд после приёма.

Расписание

Паузы после последовательных неудач: 1, 1, 2, 5, 10, 20, 20, 60, 60 минут. Успех завершает работу для этого получателя. Исчерпание попыток завершает её неуспехом. Настройки Ендпоинта delivery_interval_ms задают интервал доставки, а не пользовательское расписание этих повторов.

Фактическая попытка может начаться позднее указанной паузы. Строгий глобальный порядок и фиксированная задержка не гарантируются.

Отключённый CLI

Для нового накопленного запроса учитывается настройка Ендпоинта deliver_backlog. Уже сохранённое CLI-задание возобновляется по локальному журналу. Переподключение к серверу не означает, что каждая доставка начинается сначала. Сохраняйте каталог журнала; подробнее — Adal CLI.

Несколько получателей

У каждого Ендпоинта собственные попытки и прогресс. Общий Inbound-статус может быть partial, если результат получателей различается. Не выводите итог всего запроса из одного успешного HTTP-кода.

Ручные действия и replay

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

Два механизма идемпотентности

Механизм Что делает Чего не делает
Флаг Ендпоинта Inbound idempotency_key CLI/Direct добавляют Idempotency-Key с request_id в попытки Не заставляет получателя устранять дубли
Поле отправки Outbound idempotency_key Не допускает повторное исполнение постановки с тем же ключом пользователя в пределах срока хранения; дубль имеет duplicate_of Не гарантирует однократный HTTP-эффект и не заменяет защиту приложения

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

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

История попыток

Проверяйте конкретного получателя, время, HTTP-код и ошибку в карточке запроса. В Outbound доступны сводка и подробности исполнения; ошибка загрузки подробностей не равна неуспешной HTTP-доставке. Истёкшие HTTP-данные не делают прежнее действие невыполненным.

Хранение и расход

Повторы не продлевают исходный срок хранения. У Outbound исходное декодированное тело учитывается один раз при начале исполнения, а сохранённые ответы — по каждой попытке. Повторы не следует безусловно считать бесплатными. См. Хранение и Трафик.

Разбор ошибки

Проверьте доступность URL от исполнителя, таймаут, ответ обработчика, состояние CLI и остаток трафика. Не создавайте новое задание вместо чтения уже принятого, пока не выяснили его состояние. Не меняйте ключ, если хотите повторить именно неопределённую постановку.

Входящие запросы, отправка через API, основные понятия.

Связанная документация