Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь одного сообщения NATS через сервис RustStream: подписка, доставка, обработчик, ответ и завершение, в Core и в JetStream.
Схема текстом
- Подписка Core сервер отправляет сам → NatsMessage::Core заголовки преобразуются один раз
- Pull-консьюмер пакеты по 200 → NatsMessage::JetStream метаданные по запросу
- NatsMessage::Core заголовки преобразуются один раз → Диспетчеризация один цикл или по ключу в партиции воркеров
- NatsMessage::JetStream метаданные по запросу → Диспетчеризация один цикл или по ключу в партиции воркеров
- Диспетчеризация один цикл или по ключу в партиции воркеров → Декодирование на месте, из полезной нагрузки
- Декодирование на месте, из полезной нагрузки → Обработчик подписчика async fn под #[subscriber]
- Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер
- Ответ кодируется в буфер → NatsPublisher передаёт буфер клиенту
- NatsPublisher передаёт буфер клиенту → Завершать нечего AckError::Unsupported
- NatsPublisher передаёт буфер клиенту → +ACK без ожидания ответа
Сообщение Core сервер сам отправляет в подписку. Сообщение JetStream приходит в ответ на
pull-запрос, который async-nats отправляет на 200 сообщений за раз. В обоих случаях
NatsMessage хранит сообщение клиента в том виде, в каком оно
пришло, вместе с полезной нагрузкой.
Заголовки преобразуются в ассоциативный массив фреймворка один раз, при создании доставки. Для
сообщения без заголовков массив не создаётся вовсе. В Core субъект для ответа на запрос
добавляется в заголовок reply-to. В JetStream метаданные
читаются из субъекта подтверждения, когда их запрашивает обработчик, и не раньше.
Ответ обработчика кодируется в буфер, и издатель передаёт
этот буфер async-nats как есть, без копирования. Публикация в Core возвращает управление, как
только клиент принял сообщение. Публикация в JetStream
возвращает управление, когда стрим её подтвердил.
Доставка завершается после ответа. Подтверждение JetStream - это одно сообщение в субъект
подтверждения, отправленное без ожидания ответа. Доставку Core завершать нечем: вызов возвращает
AckError::Unsupported, и рантайм записывает это в журнал. Что делает каждый исход, показывает
страница Завершение.
Бенчмарки считают этот путь: инструкции и выделения памяти одной доставки JetStream, включая работу клиента на потоке сервиса.