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

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

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

Консьюмер Pulsar подтверждает сообщение или запрашивает его снова. Клиент запрашивает его и по тайм-ауту, а сообщение, которое возвращалось слишком часто, убирает в сторону.

Одна доставка в Pulsar: проверка dead-letter на стороне клиента, затем ack, отрицательное подтверждение или отсутствие ответа и повторная доставка, которую запрашивают два последних исходаБрокер доставляет сообщениесо счётчиком повторных доставок nПолитика dead-letter клиента:достиг ли n max_redeliver_count?На пределе:в топикdead-letter,оригиналподтверждёнНиже предела:обработчик получает сообщениеack:курсорпроходит егоnack:повторнаядоставка сразунет ack заack_timeout:клиент проситБрокер доставляет его сновасо счётчиком n + 1Повторные доставки считаются только у Shared и KeyShared:остальные типы доставляют каждое сообщение со счётчиком 0
Схема текстом
  1. Брокер доставляет сообщение со счётчиком повторных доставок n → Политика dead-letter клиента: достиг ли n max_redeliver_count?
  2. Политика dead-letter клиента: достиг ли n max_redeliver_count? → На пределе: в топик dead-letter, оригинал подтверждён
  3. Политика dead-letter клиента: достиг ли n max_redeliver_count? → Ниже предела: обработчик получает сообщение
  4. Ниже предела: обработчик получает сообщение → ack: курсор проходит его
  5. Ниже предела: обработчик получает сообщение → nack: повторная доставка сразу
  6. Ниже предела: обработчик получает сообщение → нет ack за ack_timeout: клиент просит
  7. nack: повторная доставка сразу → Брокер доставляет его снова со счётчиком n + 1
  8. нет ack за ack_timeout: клиент просит → Брокер доставляет его снова со счётчиком n + 1
  9. Повторные доставки считаются только у 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. Что отправляет каждый исход обработчика, показывает страница Завершение.