Что происходит, когда во время ручной фиксации определенного смещения происходит сбой, но следующие смещения в последовательности успешно фиксируются?

#apache-kafka #kafka-consumer-api

#apache-kafka #kafka-consumer-api

Вопрос:

Я пишу потребителя kafka, используя механизм опроса, в котором я получаю 100 сообщений за опрос. После получения сообщений я фиксирую смещение вручную одно за другим. При фиксации смещения иногда я получаю сообщение об ошибке для одного из сообщений out из 100 сообщений. Остальные смещения успешно фиксируются.

 Offsets
1,2,3,4,5,6,7,....100
 

Допустим, ошибка фиксации смещения 5, но, исключая смещение 5, все смещения были успешно зафиксированы.

Итак, в этом случае, что происходит с ошибкой фиксации смещения? Поскольку смещение перемещается последовательно, получу ли я смещение с ошибкой фиксации в следующем опросе?

Мое первичное исследование показывает, что оно считывает неудачное смещение в следующем опросе. Нужен экспертный взгляд на это.

Ответ №1:

Не требуется фиксировать каждое смещение по отдельности. И если вы фиксируете смещение X , это означает, что все меньшие смещения также фиксируются.

Комментарии:

1. Пожалуйста, обратите внимание, я намеренно фиксирую каждое смещение вручную. Итак, не требуется, чтобы, если зафиксировано смещение x, фиксировались и все меньшие смещения.

2. Хорошо. «Я намеренно фиксирую каждое смещение вручную» — это не рекомендуется, так как это создает высокую нагрузку на брокеров. Кроме того, i, f offset X get фиксирует, это означает, что все меньшие смещения фиксируются, и вы не можете это предотвратить. Вот как работает Kafka.

3. Допустим, мы устанавливаем для автоматической фиксации значение true, и обработка сообщения, которую мы выполняем после получения сообщения, завершается неудачей, тогда мы не сможем использовать то же самое сообщение снова. Он будет там в соответствии с политикой хранения, но для этого мы должны учитывать неудачные смещения сообщений. Вот что я думаю о политике автоматической фиксации. Что вы скажете?

4. Если обработка завершилась неудачно, вы можете перечитать сообщение с помощью seek() . Помогает ли это? Кроме того, я согласен с тем, что вы часто не хотите использовать автоматическую фиксацию. Однако, даже если вы используете автоматическую фиксацию, обычно нет необходимости фиксировать каждое сообщение.

5. @MatthiasJ.Sax В одном из моих проектов прецедент — использовать данные, выполнить некоторые операции и перенести их в новую тему. Я хотел бы зафиксировать смещение вручную после успешных операций, чтобы избежать потери данных, и для этого в кодировании я использую (autoCommit: false) и (consumer.commitOffsets) для фиксации смещения вручную. Как вы указали, нам не нужно фиксировать каждое смещение, потому что это создаст нагрузку на брокеров, так каким будет наилучший подход, которому я могу следовать, чтобы избежать потери данных? пожалуйста, сообщите