Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь одного сообщения Pub/Sub через сервис RustStream: streaming pull, доставка, обработчик, ответ и ack.
Схема текстом
- Streaming pull клиент берёт сообщение в аренду → Задача перекачки передаёт в канал на 16 мест
- Задача перекачки передаёт в канал на 16 мест → PubSubMessage атрибуты - в заголовки, без копирования
- PubSubMessage атрибуты - в заголовки, без копирования → Диспетчеризация один цикл или воркеры
- Диспетчеризация один цикл или воркеры → Декодирование из данных сообщения
- Декодирование из данных сообщения → Обработчик подписчика async fn под #[subscriber]
- Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер и отдаётся с ним
- Ответ кодируется в буфер и отдаётся с ним → PubSubPublisher ждёт идентификатор сообщения
- PubSubPublisher ждёт идентификатор сообщения → Завершение ack, nack или отложенная переобработка
- Завершение ack, nack или отложенная переобработка → Ack уходит со следующим пакетом клиента
Клиент снимает сообщение с потока и начинает его аренду. Задача перекачки без копирования
оборачивает его в PubSubMessage: данные остаются
буфером клиента, а атрибуты переходят в заголовки. Ключ упорядочивания становится заголовком
partition-key, а счётчик попыток - заголовком pubsub-delivery-attempt, если у подписки есть
политика dead-letter.
Ответ обработчика кодируется в буфер, который как есть становится данными исходящего сообщения, потому что клиент оставляет у себя байты, которые публикует. Заголовки становятся атрибутами. Заголовок не в UTF-8 приводит к ошибке публикации, потому что атрибут - это текст. Ключ, заданный для публикации, становится ключом упорядочивания сообщения, как показывает страница Порядок.
Издатель возвращает управление, когда Pub/Sub присвоил сообщению идентификатор. Если ответ не удалось опубликовать, доставка завершается переобработкой, и сообщение возвращается.
Доставка завершается после ответа. ack уходит со следующим пакетом подтверждений клиента, примерно через 100 миллисекунд. Чем становится каждый исход, показывает страница Завершение.