Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Консьюмер
Консьюмер librdkafka выбирает записи заранее в собственных потоках, выдаёт их по одной за опрос и фиксирует сохранённое смещение по таймеру.
Схема текстом
- Потоки librdkafka: Выборка назначенных партиций; Локальная очередь выбрано заранее; Автофиксация по таймеру, каждые 5 с
- Приложение: Опрос следующая запись; Обработка записи; Хранилище смещений в памяти, по позиции на партицию
- Кластер Kafka лидеры партиций, координатор группы → Выборка назначенных партиций: записи
- Выборка назначенных партиций → Локальная очередь выбрано заранее
- Локальная очередь выбрано заранее → Опрос следующая запись
- Опрос следующая запись → Обработка записи
- Опрос следующая запись → Хранилище смещений в памяти, по позиции на партицию: при выдаче
- Обработка записи → Хранилище смещений в памяти, по позиции на партицию: или позже
- Хранилище смещений в памяти, по позиции на партицию → Автофиксация по таймеру, каждые 5 с: чтение
- Автофиксация по таймеру, каждые 5 с → Кластер Kafka лидеры партиций, координатор группы: фиксация
librdkafka выбирает записи назначенных партиций в локальную очередь до того, как приложение их
попросит. Размер этой очереди ограничивает queued.max.messages.kbytes (64 МиБ). Когда очередь
полна, выборка для партиции приостанавливается на fetch.queue.backoff.ms (одна секунда).
Опрос снимает с очереди следующую запись.
StreamConsumer
из rust-rdkafka делает это через recv, асинхронный вызов, который можно безопасно отменить.
Хранилище смещений - это позиция в памяти для каждой партиции. По умолчанию
(enable.auto.offset.store) опрос сохраняет смещение записи, которую выдаёт, ещё до того, как
приложение её обработало. Пунктирная стрелка показывает другой путь: приложение выключает
автоматическое сохранение и сохраняет смещение, когда запись обработана.
Пока включён enable.auto.commit, таймер фиксирует сохранённые позиции каждые
auto.commit.interval.ms (пять секунд) и ещё раз при закрытии консьюмера. При падении теряется
то, что было обработано после последней фиксации, и это читается заново. При сохранении по
умолчанию запись, сохранённая при выдаче и ещё не обработанная, после падения пропускается.
Поведение и значения по умолчанию взяты из librdkafka (управление смещениями, конфигурация).