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

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

Путь

Путь одного сообщения Pulsar через сервис RustStream: консьюмер, управляющая задача, обработчик, ответ и подтверждение.

Путь одного сообщения Pulsar, на которое отвечают: от консьюмера клиента до подтвержденияКонсьюмер клиентасообщения приходят по разрешениямPulsarMessage от управляющей задачиполезная нагрузка скопирована в BytesДиспетчеризацияодин цикл или партиция воркеров по ключуДекодированиечтение из скопированной нагрузкиОбработчик подписчикаasync fn под #[subscriber]Ответкодируется в буфер, его забирает клиентPulsarPublisherпродюсер топика, ждёт квитанцииЗавершениеотправляется управляющей задачеПодтверждениезаписано в соединение, без ответа
Схема текстом
  1. Консьюмер клиента сообщения приходят по разрешениям → PulsarMessage от управляющей задачи полезная нагрузка скопирована в Bytes
  2. PulsarMessage от управляющей задачи полезная нагрузка скопирована в Bytes → Диспетчеризация один цикл или партиция воркеров по ключу
  3. Диспетчеризация один цикл или партиция воркеров по ключу → Декодирование чтение из скопированной нагрузки
  4. Декодирование чтение из скопированной нагрузки → Обработчик подписчика async fn под #[subscriber]
  5. Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер, его забирает клиент
  6. Ответ кодируется в буфер, его забирает клиент → PulsarPublisher продюсер топика, ждёт квитанции
  7. PulsarPublisher продюсер топика, ждёт квитанции → Завершение отправляется управляющей задаче
  8. Завершение отправляется управляющей задаче → Подтверждение записано в соединение, без ответа

Консьюмер клиента держит сообщения, которые брокер прислал заранее в пределах разрешений управления потоком. Управляющая задача подписки берёт следующее сообщение и собирает PulsarMessage: копирует полезную нагрузку в Bytes, сохраняет имя топика и идентификатор сообщения, которые обработчик читает через свой контекст, и превращает свойства сообщения в заголовки. Ключ партиционирования сообщения становится заголовком partition-key, который читают партиции воркеров. Доставка ждёт в канале на 16 мест, пока её не заберёт цикл диспетчеризации.

Ответ обработчика кодируется в буфер, и издатель передаёт этот буфер клиенту без копирования. Полезная нагрузка больше max_message_size отвергается до отправки: клиент размер не проверяет, а сервер на слишком большое сообщение разрывает всё соединение. Публикация возвращается, когда брокер сохранил сообщение и прислал квитанцию. Если ответ не удалось опубликовать, доставка завершается повтором.

Доставка завершается после ответа. Завершение возвращается управляющей задаче, она передаёт его клиенту, и вызов возвращается, как только клиент поставил его в очередь. Клиент записывает подтверждение в соединение и ответа не ждёт.

Страница Бенчмарки считает, во что этот путь обходится на сообщение и какая доля приходится на клиент.