Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь одной записи Kafka через сервис RustStream: очередь выборки, доставка, обработчик, ответ и фиксация.
Схема текстом
- Очередь выборки librdkafka записи выбраны заранее → KafkaMessage запись остаётся в буфере выборки
- KafkaMessage запись остаётся в буфере выборки → Диспетчеризация один цикл или партиция по ключу
- Диспетчеризация один цикл или партиция по ключу → Декодирование чтение на месте из буфера
- Декодирование чтение на месте из буфера → Обработчик подписчика async fn под #[subscriber]
- Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер цикла
- Ответ кодируется в буфер цикла → KafkaPublisher ждёт отчёта о доставке
- KafkaPublisher ждёт отчёта о доставке → Завершение решает режим Commit
- Завершение решает режим Commit → Фиксация сохранённого смещения
Запись, которую librdkafka уже выбрала, забирается без ожидания.
KafkaMessage держит её там, куда её положила librdkafka,
вместе со счётчиком ссылок на консьюмер, которому принадлежит этот буфер. Тело, ключ и заголовки
читаются из буфера выборки без копирования, а заголовки преобразуются, только когда их кто-то
запрашивает. Консьюмер остаётся открытым, пока хоть одна доставка держит его запись.
Копируется только та запись, которую поток получает сам, дождавшись её: если очередь была пуста, запись, которую вернуло ожидание, копируется наружу.
Ответ обработчика кодируется в буфер, который цикл диспетчеризации использует повторно. Издатель одалживает эти байты librdkafka, она копирует их в свою очередь, и публикация возвращается, когда кластер подтвердил запись. Если ответ не удалось опубликовать, доставка завершается повтором.
Доставка завершается после ответа. Что это значит для зафиксированного смещения, зависит от режима
Commit подписки, который показывает страница
Завершение.