
## Что повторяется {#overview}

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

## Успех и ошибка {#delivery-results}

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

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

## Автоматические попытки {#automatic-retries}

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

## Расписание {#retry-schedule}

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

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

## Отключённый CLI {#cli-pending-deliveries}

Для нового накопленного запроса учитывается настройка Ендпоинта `deliver_backlog`. Уже сохранённое CLI-задание возобновляется по локальному журналу. Переподключение к серверу не означает, что каждая доставка начинается сначала. Сохраняйте каталог журнала; подробнее — [Adal CLI](/ru/docs/inbound/adal-cli).

## Несколько получателей {#independent-deliveries}

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

## Ручные действия и replay {#manual-actions}

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

## Два механизма идемпотентности {#duplicates-and-idempotency}

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

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

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

## История попыток {#delivery-history}

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

## Хранение и расход {#limits-and-lifecycle}

Повторы не продлевают исходный срок хранения. У Outbound исходное декодированное тело учитывается один раз при начале исполнения, а сохранённые ответы — по каждой попытке. Повторы не следует безусловно считать бесплатными. См. [Хранение](/ru/docs/common/storage) и [Трафик](/ru/docs/common/traffic).

## Разбор ошибки {#troubleshooting}

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

## Дальше {#related-pages}

[Входящие запросы](/ru/docs/inbound/requests), [отправка через API](/ru/docs/outbound/sending), [основные понятия](/ru/docs/common/concepts).
