Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Подтверждение
Консьюмер Pulsar подтверждает сообщение или запрашивает его снова. Клиент запрашивает его и по тайм-ауту, а сообщение, которое возвращалось слишком часто, убирает в сторону.
Схема текстом
- Брокер доставляет сообщение со счётчиком повторных доставок n → Политика dead-letter клиента: достиг ли n max_redeliver_count?
- Политика dead-letter клиента: достиг ли n max_redeliver_count? → На пределе: в топик dead-letter, оригинал подтверждён
- Политика dead-letter клиента: достиг ли n max_redeliver_count? → Ниже предела: обработчик получает сообщение
- Ниже предела: обработчик получает сообщение → ack: курсор проходит его
- Ниже предела: обработчик получает сообщение → nack: повторная доставка сразу
- Ниже предела: обработчик получает сообщение → нет ack за ack_timeout: клиент просит
- nack: повторная доставка сразу → Брокер доставляет его снова со счётчиком n + 1
- нет ack за ack_timeout: клиент просит → Брокер доставляет его снова со счётчиком n + 1
- Повторные доставки считаются только у Shared и KeyShared: остальные типы доставляют каждое сообщение со счётчиком 0
Подтверждение отмечает одно сообщение как обработанное, и курсор сдвигается за все обработанные
сообщения. В Pulsar есть и накопительное подтверждение, которое отмечает все сообщения до
заданного, на подписках Exclusive и Failover. Этот крейт подтверждает каждое сообщение
отдельно, при любом типе подписки. Подтверждение - это команда, записанная в соединение, и брокер
на неё не отвечает.
Отрицательное подтверждение просит брокер доставить сообщение снова; его отправляет
retry обработчика. Клиент на Rust отправляет
запрос сразу, клиент на Java сначала ждёт настраиваемую задержку. Брокер доставляет сообщение
снова, тому же консьюмеру или другому консьюмеру подписки.
Тайм-аут подтверждения - это таймер клиента. Если тайм-аут задан, клиент запоминает, когда выдал каждое сообщение, проверяет дважды в секунду и просит брокер снова доставить каждое сообщение, которое ждёт дольше тайм-аута. Если не задан, сообщение, на которое никто не ответил, остаётся у консьюмера до его отключения, а затем возвращается в подписку.
На подписках Shared и KeyShared брокер считает, сколько раз он доставил сообщение повторно.
Политика dead-letter принадлежит клиенту: когда сообщение приходит со счётчиком, достигшим
предела, клиент отправляет его в топик dead-letter, добавляет свойства REAL_TOPIC и
ORIGIN_MESSAGE_ID и подтверждает оригинал. Обработчик такого сообщения не видит.
В Pulsar нет команды, которая отвергает сообщение окончательно. Сообщение покидает подписку при подтверждении, по политике dead-letter или когда истекает время жизни сообщений (TTL), заданное в пространстве имён.
Это поведение самого Apache Pulsar
(подтверждение,
отрицательное подтверждение,
тайм-аут подтверждения,
топик dead-letter)
в том виде, в каком его реализует клиент pulsar 6.9. Что отправляет каждый исход обработчика,
показывает страница Завершение.