Что повторяется
В 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 и остаток трафика. Не создавайте новое задание вместо чтения уже принятого, пока не выяснили его состояние. Не меняйте ключ, если хотите повторить именно неопределённую постановку.