Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Субъекты
Core NATS доставляет сообщение каждой подписке с подходящим субъектом, которая есть в момент его прихода, и одному участнику очереди, а сам ничего не хранит.
Схема текстом
- Очередь billing: orders.*.created участник 1 получает; orders.*.created участник 2 не получает
- Издатель orders.eu.created → Сервер NATS сверяет субъект с каждой подпиской, которая есть у него сейчас: публикует
- Сервер NATS сверяет субъект с каждой подпиской, которая есть у него сейчас → orders.eu.created тот же субъект
- Сервер NATS сверяет субъект с каждой подпиской, которая есть у него сейчас → orders.*.created * - один токен
- Сервер NATS сверяет субъект с каждой подпиской, которая есть у него сейчас → orders.> > - всё остальное
- Сервер NATS сверяет субъект с каждой подпиской, которая есть у него сейчас → orders.*.created участник 1 получает
- orders.us.* не подходит
- Сообщение без подходящей подписки теряется: Core NATS ничего не хранит
Субъект - это строка из токенов, разделённых точками. Субъект подписки может содержать шаблоны.
* заменяет ровно один токен. > заменяет один или несколько токенов и стоит последним.
Публикация всегда называет полный субъект, без шаблонов.
Сервер копирует сообщение в каждую подписку, которой оно подходит. Подписка, появившаяся позже, его уже не увидит, а сообщение, которому не подошла ни одна подписка, пропадает. Это доставка at-most-once: сервер ничего не хранит и ничего не подтверждает.
Очередь (queue group) делит работу между участниками. Сервер отдаёт каждое сообщение одному участнику очереди, а подписка вне очереди всё равно получает свою копию. Очередь определяется только именем, поэтому участники, подписанные на разные субъекты под одним именем, образуют одну очередь.
Запрос - это публикация, которая называет субъект для ответа: инбокс, на который запрашивающая сторона подписалась заранее. Отвечающая сторона публикует ответ туда. На запрос, которому не подошла ни одна подписка, сервер сразу отвечает «no responders», поэтому запрашивающей стороне не приходится ждать тайм-аута.
Начиная с NATS 2.2 сообщение может содержать заголовки. Имя заголовка состоит из печатных символов ASCII без двоеточия, а значение - одна строка. Сервер отклоняет сообщение больше своего предела полезной нагрузки, по умолчанию 1 МиБ.
Эта модель взята у самого сервера NATS (субъекты, публикация и подписка, очереди, запрос и ответ). Как стрим хранит сообщения, показывает страница Стримы, а как консьюмер их читает, - страница Консьюмеры.