Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Подтверждение
Как подтверждается доставка: что возвращает обработчик, что решает политика отказов и чем заканчивается повтор.
Схема текстом
- Доставка → Декодирование содержимого
- Декодирование содержимого → Обработчик выполняется: декодирована
- Декодирование содержимого → Не декодируется: по умолчанию drop
- Обработчик выполняется → Исход что вернуло тело: возврат
- Обработчик выполняется → Паника: по умолчанию fail_fast, сервис остановится
- Не декодируется: по умолчанию drop → Исход что вернуло тело
- Паника: по умолчанию fail_fast, сервис остановится → Исход что вернуло тело: другие политики
- Исход что вернуло тело → ack() подтверждена
- Исход что вернуло тело → drop() отклонена
- Исход что вернуло тело → retry() сейчас
- Исход что вернуло тело → retry_after позже
- retry() сейчас → Сначала проверяется предел попыток
- retry_after позже → Сначала проверяется предел попыток
- Сначала проверяется предел попыток → Ниже предела: брокер повторит или копия уйдёт на адрес повтора
- Сначала проверяется предел попыток → На пределе: копия в очередь недоставленных
- Сначала проверяется предел попыток → На пределе, без очереди недоставленных: отказ
- После подтверждения: and_after и хуки
Исход обработчика - это значение. Ok
подтверждает доставку, а исход с ошибкой говорит, как с ней поступить. Обычный Result<(), E> с
ошибкой отклоняет доставку, а не повторяет её.
Содержимое, которое не декодируется, и обработчик, который запаниковал, проходят через
политику отказов. Любая политика, кроме
fail_fast, решает судьбу доставки так же, как одноимённый исход, а skip её подтверждает.
fail_fast останавливает сервис и оставляет доставку неподтверждённой: брокер, который умеет
доставлять повторно, вернёт её после перезапуска.
Немедленный retry() без объявленного
предела попыток и очереди недоставленных возвращает
доставку брокеру обычным способом. Если объявление есть, брокер, который сам считает повторные
доставки, тоже получает доставку обратно и ведёт счёт сам. Если брокер попыток не считает, рантайм
публикует копию на адрес повтора подписки и
отклоняет оригинал. Копия несёт номер попытки в заголовке.
Отложенный retry_after пользуется отложенной
повторной доставкой брокера, если она есть. Иначе рантайм публикует копию после задержки, с
объявлением или без него.
Объявленный предел проверяется перед любым повтором. На пределе доставка с объявленной очередью недоставленных копируется туда, а без неё отклоняется. Брокер, который сам переносит доставки с исчерпанными попытками, получает объявление при запуске и применяет его сам.
Если брокер отказывается принять подтверждение, отказ записывается в журнал, и цикл идёт дальше.