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

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

Завершение

Чем ack, drop, retry и retry_after становятся на файле потока и в канале, которые не хранят позиций консьюмеров и ничего не подтверждают.

Исход обработчика на файле потока или в канале: сообщение возвращает только копия, которую публикует рантаймИсход обработчикаack, drop:ошибка: неподдерживаются,запись в журналretry():возврат вочередь неподдерживается,запись в журналretry_after(d):рантаймпубликуеткопиюНикто не записывает, докуда дочитал сервис:после перезапуска он начинает с позиции, которую сохранил
Схема текстом
  1. Исход обработчика → ack, drop: ошибка: не поддерживаются, запись в журнал
  2. Исход обработчика → retry(): возврат в очередь не поддерживается, запись в журнал
  3. Исход обработчика → retry_after(d): рантайм публикует копию
  4. Никто не записывает, докуда дочитал сервис: после перезапуска он начинает с позиции, которую сохранил

Ни один клиент не записывает, что читатель уже обработал. Поэтому ack и nack доставки сразу возвращают AckError::Unsupported, и рантайм пишет это в журнал. Подтверждённое сообщение нигде не отмечается, а возвращённое в очередь не приходит снова. Сервис после перезапуска продолжает с позиции, которую сохранил сам.

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

Повторы​

Повтор на файле потока или в канале: предел попыток выбирает между копией, ключом dead-letter и ничемretry_after(d) или retry() при объявленном пределезаголовок счётчика повторов называет попыткуmax_attempts: попытка ниже предела?Ниже предела:копия, послезадержки,если она естьНа пределе:копия подключdead-letterНа пределе,без dead-letter:ничего непишетсяФайл: тот жеключ потока,его читает подпискаКанал: ключиз out_retry, дляследующей ступениОтложенную копию держит процесс:сбой до срабатывания таймера её теряет
Схема текстом
  1. retry_after(d) или retry() при объявленном пределе заголовок счётчика повторов называет попытку → max_attempts: попытка ниже предела?: повтор
  2. max_attempts: попытка ниже предела? → Ниже предела: копия, после задержки, если она есть: ниже
  3. max_attempts: попытка ниже предела? → На пределе: копия под ключ dead-letter: на пределе
  4. max_attempts: попытка ниже предела? → На пределе, без dead-letter: ничего не пишется
  5. Ниже предела: копия, после задержки, если она есть → Файл: тот же ключ потока, его читает подписка: файл
  6. Ниже предела: копия, после задержки, если она есть → Канал: ключ из out_retry, для следующей ступени: канал
  7. Отложенную копию держит процесс: сбой до срабатывания таймера её теряет

Этим путём идут исход retry_after, а также retry() у регистрации, которая объявляет max_attempts или ключ dead-letter. Ни один транспорт не считает свои доставки, поэтому номер попытки передаётся в заголовке копии со счётчиком повторов, и первая доставка считается первой попыткой. Сначала проверяется предел. На пределе копию получает объявленный dead-letter, а без него доставка отклоняется и ничего не пишется.

Ниже предела рантайм отбрасывает доставку и публикует копию, у retry_after после задержки. На файле потока ключ потока служит обоими концами: подписка сообщает ключ, который читает, и копия дописывается под ним, поэтому точке монтирования ничего называть не нужно. Воспроизведение читает копию, только пока ещё не дошло до конца файла.

В канале копия уходит в стандартный вывод, к следующей ступени, поэтому точка монтирования называет её ключ через out_retry. Регистрация в канале, которая ключа не называет, не запускается.