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

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

Жизненный цикл

NatsBroker::new записывает конфигурацию, connect подключается к серверу, старт подписывается на каждый субъект или создаёт каждый консьюмер, а завершение работы выполняет drain.

Три состояния брокера как типы и то, что каждый переход делает в NATSБрокерВ NATSNatsBroker::new(адреса)ConnectedNatsBrokerClosedNatsBrokerитоговые счётчикиАдреса и параметры,без ввода-выводаПодключениес параметрамиКаждая подписка Core:SUB, затем flushКаждая JetStream:найти стрим,создать консьюмерОтметка о закрытии,затем drainИздатель, переживший соединение,отвечает NatsError::Closed, а не молчаливым успехом
Схема текстом
  1. Брокер: NatsBroker::new (адреса); ConnectedNatsBroker; ClosedNatsBroker итоговые счётчики
  2. В NATS: Адреса и параметры, без ввода-вывода; Подключение с параметрами; Каждая подписка Core: SUB, затем flush; Каждая JetStream: найти стрим, создать консьюмер; Отметка о закрытии, затем drain
  3. NatsBroker::new (адреса) → ConnectedNatsBroker: connect(self)
  4. ConnectedNatsBroker → ClosedNatsBroker итоговые счётчики: shutdown(self)
  5. Адреса и параметры, без ввода-вывода → Подключение с параметрами
  6. Подключение с параметрами → Каждая подписка Core: SUB, затем flush
  7. Каждая подписка Core: SUB, затем flush → Каждая JetStream: найти стрим, создать консьюмер
  8. Каждая JetStream: найти стрим, создать консьюмер → Отметка о закрытии, затем drain
  9. Издатель, переживший соединение, отвечает NatsError::Closed, а не молчаливым успехом

new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Он принимает один адрес или список адресов через запятую, а with_options задаёт параметры подключения async-nats. Рантайм подключает брокер при старте приложения. Подключение использует эти параметры. Если сервер недоступен, старт прерывается с ошибкой NatsError::Connect.

Дескриптор каждой подписки разрешается один раз, по подключённому брокеру. Подписка Core отправляет SUB, а затем ждёт ответа на flush. К этому моменту сервер уже зарегистрировал подписку, поэтому издатель на другом соединении не может опубликовать сообщение в промежуток. Подписка JetStream ищет свой стрим по имени и создаёт pull-консьюмер, и на оба запроса отвечает сервер. Несуществующий стрим прерывает старт с ошибкой NatsError::JetStream.

Завершение работы сначала помечает соединение закрытым, чтобы издатель, который на него ссылается, не успел отправить сообщение. Затем оно выполняет drain клиента: подписки останавливаются, уже опубликованное отправляется, и соединение закрывается. ClosedNatsBroker хранит счётчики клиента: отправленные сообщения, полученные сообщения и подключения.

Издатель, инстанцированный до завершения работы, - это дескриптор, который завершение не может отозвать. Он возвращает ошибку NatsError::Closed с субъектом, в который его просили опубликовать.

Транспорт внутри процесса проходит ту же последовательность переходов жизненного цикла. Он разбирает адреса так же, как connect, и читает no_echo и префикс инбокса из параметров подключения.