Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь одного сообщения Pulsar через сервис RustStream: консьюмер, управляющая задача, обработчик, ответ и подтверждение.
Схема текстом
- Консьюмер клиента сообщения приходят по разрешениям → PulsarMessage от управляющей задачи полезная нагрузка скопирована в Bytes
- PulsarMessage от управляющей задачи полезная нагрузка скопирована в Bytes → Диспетчеризация один цикл или партиция воркеров по ключу
- Диспетчеризация один цикл или партиция воркеров по ключу → Декодирование чтение из скопированной нагрузки
- Декодирование чтение из скопированной нагрузки → Обработчик подписчика async fn под #[subscriber]
- Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер, его забирает клиент
- Ответ кодируется в буфер, его забирает клиент → PulsarPublisher продюсер топика, ждёт квитанции
- PulsarPublisher продюсер топика, ждёт квитанции → Завершение отправляется управляющей задаче
- Завершение отправляется управляющей задаче → Подтверждение записано в соединение, без ответа
Консьюмер клиента держит сообщения, которые брокер прислал заранее в пределах разрешений
управления потоком. Управляющая задача подписки берёт следующее сообщение и собирает
PulsarMessage: копирует полезную нагрузку в Bytes,
сохраняет имя топика и идентификатор сообщения, которые обработчик читает через свой
контекст, и превращает свойства сообщения в
заголовки. Ключ партиционирования сообщения становится
заголовком partition-key, который читают партиции
воркеров. Доставка ждёт в канале на 16 мест, пока её не заберёт цикл диспетчеризации.
Ответ обработчика кодируется в буфер, и издатель
передаёт этот буфер клиенту без копирования. Полезная нагрузка больше
max_message_size отвергается до
отправки: клиент размер не проверяет, а сервер на слишком большое сообщение разрывает всё
соединение. Публикация возвращается, когда брокер сохранил сообщение и прислал квитанцию. Если
ответ не удалось опубликовать, доставка завершается повтором.
Доставка завершается после ответа. Завершение возвращается управляющей задаче, она передаёт его клиенту, и вызов возвращается, как только клиент поставил его в очередь. Клиент записывает подтверждение в соединение и ответа не ждёт.
Страница Бенчмарки считает, во что этот путь обходится на сообщение и какая доля приходится на клиент.