Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Стримы
Стрим JetStream сохраняет то, что публикуется в его субъекты, под порядковым номером, подтверждает каждую публикацию, а консьюмеры читают его каждый со своей позиции.
Схема текстом
- Стрим ORDERS: 1; 2; 3; 4; 5; 6; Повтор Nats-Msg-Id в пределах двух минут подтверждается снова, а хранится один раз
- Durable-консьюмер billing: реплика 1; реплика 2
- Издатель orders.created, Nats-Msg-Id → Стрим ORDERS: публикует
- 6 → PubAck стрим ORDERS, номер 6, не дубликат: PubAck
- Стрим ORDERS → Durable-консьюмер billing: читает
- Стрим ORDERS → Эфемерный консьюмер удаляется, когда простаивает: читает
- Каждый консьюмер хранит свою позицию в стриме; участники durable-консьюмера делят одну
Стрим захватывает сообщения, опубликованные в перечисленные в нём субъекты, здесь orders.*. Он
нумерует их по порядку и хранит, пока их не удалит политика хранения: по пределам числа, размера и
возраста, пока они нужны хотя бы одному консьюмеру или пока их не подтвердит консьюмер рабочей
очереди.
Издатель получает ответ на каждое сообщение: имя стрима, порядковый номер и то, был ли это дубликат. Публикация, которую не захватил ни один стрим, получает ошибку, а не молчание, как в Core NATS.
Заголовки сообщения задают то, что сервер проверяет перед сохранением. Nats-Msg-Id даёт
сообщению имя, и повтор внутри окна дубликатов стрима (по умолчанию две минуты) получает подтверждение
как дубликат и сохраняется один раз. Nats-Expected-Stream, Nats-Expected-Last-Sequence,
Nats-Expected-Last-Subject-Sequence и Nats-Expected-Last-Msg-Id заставляют сервер отклонить
публикацию, если стрим не в том состоянии, которого ждёт издатель.
ruststream-nats не создаёт стримов. Стрим создают и настраивают утилитой nats или через API
JetStream, а подписка находит его по имени при старте сервиса.
Эта модель взята у самого сервера NATS (стримы, заголовки, дедупликация). Как консьюмер читает стрим, показывает страница Консьюмеры.