commit offset в Kafka нужен, чтобы зафиксировать, до какого сообщения потребитель дошёл, и с какого места ему продолжать чтение после перезапуска или ребалансировки. Это позволяет избежать потери данных и контролировать, будут ли сообщения обработаны повторно или нет. Фактически, коммит смещений задаёт модель доставки: at-most-once, at-least-once или близко к exactly-once.
В Kafka каждое сообщение в разделе (partition) имеет порядковый номер — offset. Потребитель сам отвечает за то, чтобы запомнить, до какого смещения он успешно обработал сообщения. Операция commit offset как раз и фиксирует это смещение в Kafka (в специальном топике __consumer_offsets), чтобы при перезапуске или перераспределении партиций потребитель мог продолжить чтение с нужного места.
Зачем это нужно:
offset и начнёт с него, а не с начала или с конца партиции.commit, определяет семантику: если коммитить до обработки, можно потерять сообщения (at-most-once); если после успешной обработки — возможны редкие повторы, но без потерь (at-least-once); в более сложных сценариях с транзакциями Kafka можно приблизиться к exactly-once.Есть два основных подхода: авто-коммит и ручной коммит. При авто-коммите (enable.auto.commit=true) клиент сам раз в заданный интервал коммитит последнее прочитанное смещение — это проще, но вы теряете точный контроль, действительно ли сообщение уже безопасно обработано. При ручном коммите (enable.auto.commit=false) вы сначала обрабатываете сообщения (записываете в БД, вызываете внешние сервисы и т. д.), и только после успешного завершения делаете commit — это даёт предсказуемое поведение и типичную семантику at-least-once.
Таким образом, commit offset — это механизм, который делает потребление сообщений в Kafka управляемым и надёжным: он даёт возможность точно указать, какие сообщения уже «безопасно» обработаны, а какие ещё нет, и от этого зависят гарантии доставки и поведение системы при сбоях.
Отметьте свой прогресс