Перейти к основному содержимому
Нормативная версия документации - английская

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

Подтверждение

Как подтверждается доставка: что возвращает обработчик, что решает политика отказов и чем заканчивается повтор.

От доставки до подтверждения: декодирование, обработчик, исход, повтор и недоставленныеДоставкаДекодированиесодержимогоОбработчиквыполняетсяИсходчто вернуло телоНе декодируется:по умолчанию dropПаника:по умолчанию fail_fast,сервис остановитсяack()подтвержденаdrop()отклоненаretry()сейчасretry_afterпозжеСначала проверяется предел попытокНиже предела:брокер повторитили копия уйдётна адрес повтораНа пределе:копия в очередьнедоставленныхНа пределе,без очерединедоставленных:отказПосле подтверждения:and_after и хуки
Схема текстом
  1. Доставка → Декодирование содержимого
  2. Декодирование содержимого → Обработчик выполняется: декодирована
  3. Декодирование содержимого → Не декодируется: по умолчанию drop
  4. Обработчик выполняется → Исход что вернуло тело: возврат
  5. Обработчик выполняется → Паника: по умолчанию fail_fast, сервис остановится
  6. Не декодируется: по умолчанию drop → Исход что вернуло тело
  7. Паника: по умолчанию fail_fast, сервис остановится → Исход что вернуло тело: другие политики
  8. Исход что вернуло тело → ack() подтверждена
  9. Исход что вернуло тело → drop() отклонена
  10. Исход что вернуло тело → retry() сейчас
  11. Исход что вернуло тело → retry_after позже
  12. retry() сейчас → Сначала проверяется предел попыток
  13. retry_after позже → Сначала проверяется предел попыток
  14. Сначала проверяется предел попыток → Ниже предела: брокер повторит или копия уйдёт на адрес повтора
  15. Сначала проверяется предел попыток → На пределе: копия в очередь недоставленных
  16. Сначала проверяется предел попыток → На пределе, без очереди недоставленных: отказ
  17. После подтверждения: and_after и хуки

Исход обработчика - это значение. Ok подтверждает доставку, а исход с ошибкой говорит, как с ней поступить. Обычный Result<(), E> с ошибкой отклоняет доставку, а не повторяет её.

Содержимое, которое не декодируется, и обработчик, который запаниковал, проходят через политику отказов. Любая политика, кроме fail_fast, решает судьбу доставки так же, как одноимённый исход, а skip её подтверждает. fail_fast останавливает сервис и оставляет доставку неподтверждённой: брокер, который умеет доставлять повторно, вернёт её после перезапуска.

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

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

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

Если брокер отказывается принять подтверждение, отказ записывается в журнал, и цикл идёт дальше.