Вопрос проверяет понимание механизма прогресса чтения в Kafka и того, как консьюмеры управляют обработкой сообщений.
Offset — это порядковый номер сообщения внутри партиции. Консьюмеры используют offset, чтобы понимать, какие сообщения уже обработаны. Kafka не хранит «состояние очереди», а полагается на offsets. Каждый consumer group хранит offsets независимо. Благодаря этому сообщения можно перечитывать и обрабатывать повторно.
Offset — это ключевой механизм, который отличает Kafka от классических очередей сообщений. Он позволяет Kafka быть не просто транспортом, а долговременным журналом событий.
Offset — это монотонно возрастающий номер сообщения внутри конкретной партиции, который определяет позицию чтения.
Когда продюсер отправляет сообщение:
оно записывается в конец партиции;
Kafka присваивает ему следующий offset: 0, 1, 2, ....
Важно:
offset уникален только внутри партиции;
одинаковые offset в разных партициях — это нормально.
Консьюмер работает по принципу:
прочитал сообщение с offset N;
обработал его;
зафиксировал, что следующий offset для чтения — N+1.
Kafka не знает, «обработано» ли сообщение по бизнес-смыслу — она знает только, какой offset сохранён.
Коммит — это запись текущей позиции чтения.
Основные варианты:
автоматический коммит — Kafka сама периодически сохраняет offset;
ручной коммит — приложение решает, когда сохранить offset.
Пример ручного подхода:
msg = poll()
process(msg)
commit_offset(msg.offset + 1)
Современная Kafka хранит offsets:
в специальном системном топике __consumer_offsets;
отдельно для каждой consumer group.
Это значит:
разные группы читают один и тот же топик независимо;
прогресс одной группы не влияет на другую.
Offset напрямую связан с гарантиями доставки.
сообщение обработано;
offset не сохранён;
после рестарта сообщение будет обработано повторно.
Результат: дубликат (at least once).
offset сохранён;
сообщение считается «прочитанным»;
повторной обработки не будет.
Если бизнес-логика не выполнилась — сообщение фактически потеряно для группы.
Kafka позволяет управлять offset вручную:
начинать чтение с начала (earliest);
читать только новые сообщения (latest);
перематывать назад для переобработки.
Это удобно для:
отладки;
повторного расчёта данных;
восстановления состояния.
Перед завершением важно отметить частые проблемы:
коммит offset до обработки;
слепое использование автокоммита;
отсутствие идемпотентности при at least once.
Offset — это механизм контроля прогресса чтения в Kafka. Консьюмеры сами отвечают за то, когда сообщение считается обработанным, а правильное управление offset — ключ к надёжной и предсказуемой обработке данных.