Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Жизненный цикл
NatsBroker::new записывает конфигурацию, connect
подключается к серверу, старт подписывается на каждый субъект или создаёт каждый консьюмер, а
завершение работы выполняет drain.
Схема текстом
- Брокер: NatsBroker::new (адреса); ConnectedNatsBroker; ClosedNatsBroker итоговые счётчики
- В NATS: Адреса и параметры, без ввода-вывода; Подключение с параметрами; Каждая подписка Core: SUB, затем flush; Каждая JetStream: найти стрим, создать консьюмер; Отметка о закрытии, затем drain
- NatsBroker::new (адреса) → ConnectedNatsBroker: connect(self)
- ConnectedNatsBroker → ClosedNatsBroker итоговые счётчики: shutdown(self)
- Адреса и параметры, без ввода-вывода → Подключение с параметрами
- Подключение с параметрами → Каждая подписка Core: SUB, затем flush
- Каждая подписка Core: SUB, затем flush → Каждая JetStream: найти стрим, создать консьюмер
- Каждая JetStream: найти стрим, создать консьюмер → Отметка о закрытии, затем drain
- Издатель, переживший соединение, отвечает NatsError::Closed, а не молчаливым успехом
new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Он принимает один
адрес или список адресов через запятую, а with_options
задаёт параметры подключения async-nats. Рантайм подключает брокер при старте приложения.
Подключение использует эти параметры. Если сервер недоступен, старт прерывается с ошибкой
NatsError::Connect.
Дескриптор каждой подписки разрешается один раз, по
подключённому брокеру. Подписка Core отправляет SUB, а затем ждёт ответа на flush. К этому
моменту сервер уже зарегистрировал подписку, поэтому издатель на другом соединении не может
опубликовать сообщение в промежуток. Подписка JetStream ищет свой стрим по имени и создаёт
pull-консьюмер, и на оба запроса отвечает сервер. Несуществующий стрим прерывает старт с ошибкой
NatsError::JetStream.
Завершение работы сначала помечает соединение закрытым, чтобы
издатель, который на него ссылается, не успел отправить сообщение. Затем оно выполняет drain
клиента: подписки останавливаются, уже опубликованное отправляется, и соединение закрывается.
ClosedNatsBroker хранит счётчики клиента: отправленные
сообщения, полученные сообщения и подключения.
Издатель, инстанцированный до завершения работы, - это дескриптор, который завершение не может
отозвать. Он возвращает ошибку NatsError::Closed с субъектом, в который его просили опубликовать.
Транспорт внутри процесса проходит ту же последовательность переходов жизненного цикла. Он
разбирает адреса так же, как connect, и читает no_echo и префикс инбокса из параметров
подключения.