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

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

Путь

Путь одного сообщения NATS через сервис RustStream: подписка, доставка, обработчик, ответ и завершение, в Core и в JetStream.

Путь одного сообщения, на которое отвечают: Core NATS слева, JetStream справа, через один общий путь рантаймаПодписка Coreсервер отправляет самPull-консьюмерпакеты по 200NatsMessage::Coreзаголовки преобразуютсяодин разNatsMessage::JetStreamметаданные по запросуДиспетчеризацияодин цикл или по ключув партиции воркеровДекодированиена месте, из полезной нагрузкиОбработчик подписчикаasync fn под #[subscriber]Ответкодируется в буферNatsPublisherпередаёт буфер клиентуЗавершать нечегоAckError::Unsupported+ACKбез ожидания ответа
Схема текстом
  1. Подписка Core сервер отправляет сам → NatsMessage::Core заголовки преобразуются один раз
  2. Pull-консьюмер пакеты по 200 → NatsMessage::JetStream метаданные по запросу
  3. NatsMessage::Core заголовки преобразуются один раз → Диспетчеризация один цикл или по ключу в партиции воркеров
  4. NatsMessage::JetStream метаданные по запросу → Диспетчеризация один цикл или по ключу в партиции воркеров
  5. Диспетчеризация один цикл или по ключу в партиции воркеров → Декодирование на месте, из полезной нагрузки
  6. Декодирование на месте, из полезной нагрузки → Обработчик подписчика async fn под #[subscriber]
  7. Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер
  8. Ответ кодируется в буфер → NatsPublisher передаёт буфер клиенту
  9. NatsPublisher передаёт буфер клиенту → Завершать нечего AckError::Unsupported
  10. NatsPublisher передаёт буфер клиенту → +ACK без ожидания ответа

Сообщение Core сервер сам отправляет в подписку. Сообщение JetStream приходит в ответ на pull-запрос, который async-nats отправляет на 200 сообщений за раз. В обоих случаях NatsMessage хранит сообщение клиента в том виде, в каком оно пришло, вместе с полезной нагрузкой.

Заголовки преобразуются в ассоциативный массив фреймворка один раз, при создании доставки. Для сообщения без заголовков массив не создаётся вовсе. В Core субъект для ответа на запрос добавляется в заголовок reply-to. В JetStream метаданные читаются из субъекта подтверждения, когда их запрашивает обработчик, и не раньше.

Ответ обработчика кодируется в буфер, и издатель передаёт этот буфер async-nats как есть, без копирования. Публикация в Core возвращает управление, как только клиент принял сообщение. Публикация в JetStream возвращает управление, когда стрим её подтвердил.

Доставка завершается после ответа. Подтверждение JetStream - это одно сообщение в субъект подтверждения, отправленное без ожидания ответа. Доставку Core завершать нечем: вызов возвращает AckError::Unsupported, и рантайм записывает это в журнал. Что делает каждый исход, показывает страница Завершение.

Бенчмарки считают этот путь: инструкции и выделения памяти одной доставки JetStream, включая работу клиента на потоке сервиса.