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

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

Консьюмеры

Pull-консьюмер JetStream выдаёт пакеты, которые запрашивает клиент, и ждёт ответа на каждое сообщение: подтверждения, отрицательного подтверждения или прекращения доставки.

Pull-консьюмер стрима ORDERS: клиент запрашивает пакет, получает сообщения и отвечает на каждое +ACK, -NAK или +TERMСтрим ORDERSPull-консьюмер billingпозиция в стриме, субъект-фильтр,политика доставки, ack_wait, max_ack_pendingПодпискаберёт по одному сообщению+ACKготово: большене доставляется-NAKдоставить снова:сразу илипосле задержки+TERMконец: большене доставляетсяСообщение без ответа дольше ack_wait доставляется снова,и его счётчик delivered растёт на единицу
Схема текстом
  1. Стрим ORDERS → Pull-консьюмер billing позиция в стриме, субъект-фильтр, политика доставки, ack_wait, max_ack_pending
  2. Pull-консьюмер billing позиция в стриме, субъект-фильтр, политика доставки, ack_wait, max_ack_pending → Подписка берёт по одному сообщению: сообщения
  3. Подписка берёт по одному сообщению → Pull-консьюмер billing позиция в стриме, субъект-фильтр, политика доставки, ack_wait, max_ack_pending: pull: пакет, срок
  4. Подписка берёт по одному сообщению → +ACK готово: больше не доставляется
  5. Подписка берёт по одному сообщению → -NAK доставить снова: сразу или после задержки
  6. Подписка берёт по одному сообщению → +TERM конец: больше не доставляется
  7. Сообщение без ответа дольше ack_wait доставляется снова, и его счётчик delivered растёт на единицу

Консьюмер - это представление одного стрима со своей позицией. Субъект-фильтр сужает круг сообщений стрима, которые он читает, а политика доставки задаёт, с чего начинает новый консьюмер: с первого сообщения, с последнего, только с новых, с порядкового номера или с момента времени. У durable-консьюмера есть имя, он переживает перезапуск, и его делят все клиенты, которые привязываются к этому имени. У эфемерного консьюмера имени нет, и сервер удаляет его, как только его никто не читает.

Pull-консьюмер ничего не отправляет, пока клиент не попросит. Pull-запрос называет размер пакета и срок ожидания, и до истечения срока сервер отвечает не больше чем таким числом сообщений. async-nats поддерживает поток запросов: запрашивает по 200 сообщений, запрашивает снова, когда разобрана половина, и, пока ждёт ответа, рассчитывает получать сигнал активности (heartbeat) каждые 15 секунд.

Каждое сообщение ждёт ответа. +ACK завершает его. -NAK отправляет его снова, сразу или после задержки, указанной в ответе. +TERM прекращает его без новой доставки. Сообщение без ответа в течение ack_wait уходит на повторную доставку, и каждая доставка увеличивает его счётчик delivered. max_ack_pending ограничивает, сколько сообщений могут одновременно ждать ответа: на пределе консьюмер больше ничего не выдаёт.

Субъект подтверждения каждой доставки содержит её метаданные: имена стрима и консьюмера, порядковые номера в стриме и в консьюмере, счётчик delivered и число сообщений, которые ещё ждут выдачи.

ruststream-nats создаёт консьюмер при старте сервиса и явно передаёт ack_wait (30 секунд), max_ack_pending (1024) и политику доставки (все сообщения). Остальная конфигурация сохраняет значения сервера по умолчанию.

Эта модель взята у самого сервера NATS (консьюмеры, модели подтверждения).