Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Консьюмеры
Pull-консьюмер JetStream выдаёт пакеты, которые запрашивает клиент, и ждёт ответа на каждое сообщение: подтверждения, отрицательного подтверждения или прекращения доставки.
Схема текстом
- Стрим ORDERS → Pull-консьюмер billing позиция в стриме, субъект-фильтр, политика доставки, ack_wait, max_ack_pending
- Pull-консьюмер billing позиция в стриме, субъект-фильтр, политика доставки, ack_wait, max_ack_pending → Подписка берёт по одному сообщению: сообщения
- Подписка берёт по одному сообщению → Pull-консьюмер billing позиция в стриме, субъект-фильтр, политика доставки, ack_wait, max_ack_pending: pull: пакет, срок
- Подписка берёт по одному сообщению → +ACK готово: больше не доставляется
- Подписка берёт по одному сообщению → -NAK доставить снова: сразу или после задержки
- Подписка берёт по одному сообщению → +TERM конец: больше не доставляется
- Сообщение без ответа дольше 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 (консьюмеры, модели подтверждения).