Как истекает срок действия аннулирования для группы потребителей Apache Kafka?

Я делал несколько тестов на старую тему, когда заметил странное поведение. Читая журнал Kafka, я заметил это сообщение "удалено 8 истекших смещений":

[GroupCoordinator 1001]: Stabilized group GROUP_NAME generation 37 (kafka.coordinator.GroupCoordinator)
[GroupCoordinator 1001]: Assignment received from leader for group GROUP_NAME for generation 37 (kafka.coordinator.GroupCoordinator)
Deleting segment 0 from log __consumer_offsets-31. (kafka.log.Log)
Deleting segment 0 from log __consumer_offsets-45. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-45/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting index /data/kafka-logs/__consumer_offsets-31/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting segment 0 from log __consumer_offsets-13. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-13/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting segment 0 from log __consumer_offsets-11. (kafka.log.Log)
Deleting segment 4885 from log __consumer_offsets-11. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-11/00000000000000004885.index.deleted (kafka.log.OffsetIndex)
Deleting index /data/kafka-logs/__consumer_offsets-11/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting segment 0 from log __consumer_offsets-26. (kafka.log.Log)
Deleting segment 12406 from log __consumer_offsets-26. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-26/00000000000000012406.index.deleted (kafka.log.OffsetIndex)
Deleting index /data/kafka-logs/__consumer_offsets-26/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting segment 0 from log __consumer_offsets-22. (kafka.log.Log)
Deleting segment 8643 from log __consumer_offsets-22. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-22/00000000000000008643.index.deleted (kafka.log.OffsetIndex)
Deleting index /data/kafka-logs/__consumer_offsets-22/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting segment 0 from log __consumer_offsets-6. (kafka.log.Log)
Deleting segment 9757 from log __consumer_offsets-6. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-6/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
Deleting index /data/kafka-logs/__consumer_offsets-6/00000000000000009757.index.deleted (kafka.log.OffsetIndex)
Deleting segment 0 from log __consumer_offsets-14. (kafka.log.Log)
Deleting segment 1 from log __consumer_offsets-14. (kafka.log.Log)
Deleting index /data/kafka-logs/__consumer_offsets-14/00000000000000000001.index.deleted (kafka.log.OffsetIndex)
Deleting index /data/kafka-logs/__consumer_offsets-14/00000000000000000000.index.deleted (kafka.log.OffsetIndex)
[GroupCoordinator 1001]: Preparing to restabilize group GROUP_NAME with old generation 37 (kafka.coordinator.GroupCoordinator)
[GroupCoordinator 1001]: Stabilized group GROUP_NAME generation 38 (kafka.coordinator.GroupCoordinator)
[GroupCoordinator 1001]: Assignment received from leader for group GROUP_NAME for generation 38 (kafka.coordinator.GroupCoordinator)
[Group Metadata Manager on Broker 1001]: Removed 8 expired offsets in 1 milliseconds. (kafka.coordinator.GroupMetadataManager)

На самом деле у меня есть 2 вопроса:

  1. Как работает истечение этого смещения для группы потребителей?

  2. Может ли это смещение с истекшим сроком действия объяснить это поведение, когда мой потребитель не будет ничего опрашивать, когда у него было auto.offset.reset = latest, но он опрашивал с последнего зафиксированного смещения, когда у него было auto.offset.reset = earliest?

Ответ 1

Кафка по умолчанию удаляет зафиксированные смещения по истечении настраиваемого периода времени. Смотрите параметр offsets.retention.minutes. Т.е., если группа потребителей неактивна (то есть не фиксирует смещения) в течение этого времени, смещения удаляются. Таким образом, даже если потребитель работает, если он не offset.retention.minutes смещения для некоторых разделов, эти смещения подлежат offset.retention.minutes.

Если вы начинаете потребителя, происходит следующее:

  1. искать (действительное) зафиксированное смещение (для группы потребителей)
    1. если найдено корректное смещение, возобновить оттуда
    2. если действительное смещение не найдено, сбросьте смещение в соответствии с параметром auto.offset.reset

Таким образом, если ваши смещения были удалены и auto.offset.reset = latest, ваш потребитель не будет ничего опрашивать, пока новые данные не будут добавлены в тему. Если auto.offset.reset = earliest он должен auto.offset.reset = earliest всю тему.

См. Эту JIRA для обсуждения об этом https://issues.apache.org/jira/browse/KAFKA-3806 и https://issues.apache.org/jira/browse/KAFKA-4682

Ответ 2

Проверьте мой ответ здесь. Вы не должны забывать о перемещении файлов. Это влияет на удаление смещенных файлов.