Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Завершение
Чем ack, drop, retry и retry_after становятся
на файле потока и в канале, которые не хранят позиций консьюмеров и ничего не подтверждают.
Схема текстом
- Исход обработчика → ack, drop: ошибка: не поддерживаются, запись в журнал
- Исход обработчика → retry(): возврат в очередь не поддерживается, запись в журнал
- Исход обработчика → retry_after(d): рантайм публикует копию
- Никто не записывает, докуда дочитал сервис: после перезапуска он начинает с позиции, которую сохранил
Ни один клиент не записывает, что читатель уже обработал. Поэтому
ack и nack доставки сразу возвращают
AckError::Unsupported, и рантайм пишет это в журнал. Подтверждённое сообщение нигде не
отмечается, а возвращённое в очередь не приходит снова. Сервис после перезапуска продолжает с
позиции, которую сохранил сам.
Повтор - единственный исход, который возвращает сообщение, и всю работу для него выполняет рантайм.
Повторы
Схема текстом
- retry_after(d) или retry() при объявленном пределе заголовок счётчика повторов называет попытку → max_attempts: попытка ниже предела?: повтор
- max_attempts: попытка ниже предела? → Ниже предела: копия, после задержки, если она есть: ниже
- max_attempts: попытка ниже предела? → На пределе: копия под ключ dead-letter: на пределе
- max_attempts: попытка ниже предела? → На пределе, без dead-letter: ничего не пишется
- Ниже предела: копия, после задержки, если она есть → Файл: тот же ключ потока, его читает подписка: файл
- Ниже предела: копия, после задержки, если она есть → Канал: ключ из out_retry, для следующей ступени: канал
- Отложенную копию держит процесс: сбой до срабатывания таймера её теряет
Этим путём идут исход retry_after, а также retry() у регистрации, которая объявляет
max_attempts или
ключ dead-letter. Ни один транспорт не считает свои
доставки, поэтому номер попытки передаётся в заголовке копии со счётчиком повторов, и первая
доставка считается первой попыткой. Сначала проверяется предел. На пределе копию получает
объявленный dead-letter, а без него доставка отклоняется и ничего не пишется.
Ниже предела рантайм отбрасывает доставку и публикует копию, у retry_after после задержки. На
файле потока ключ потока служит обоими концами: подписка сообщает ключ, который читает, и копия
дописывается под ним, поэтому точке монтирования ничего называть не нужно. Воспроизведение читает
копию, только пока ещё не дошло до конца файла.
В канале копия уходит в стандартный вывод, к следующей ступени, поэтому точка монтирования
называет её ключ через out_retry. Регистрация в канале,
которая ключа не называет, не запускается.