Можно ли читать напрямую с партиций Kafka без consumer group
Что проверяют
Понимаете ли вы, что consumer group это механизм координации и хранения смещений, а не единственный способ дотянуться до данных. Заодно смотрят, знаете ли вы, чем придётся платить за отказ от группы.
Как отвечать
Да, читать можно. На уровне протокола чтение это запрос Fetch к брокеру, который является лидером партиции, и группа для него не нужна. Группа решает три другие задачи: распределяет партиции между участниками, перебалансирует их при уходе и приходе потребителей, хранит коммиты смещений в служебном топике __consumer_offsets.
Без группы вы сами назначаете партиции и сами держите позицию. В Go это выглядит так:
- в
segmentio/kafka-go:kafka.NewReaderс заданнымPartitionи безGroupID, стартовая позиция черезSetOffset; - в
franz-go:kgo.ConsumePartitionsс явными смещениями; - в
sarama: обычныйConsumerиConsumePartition.
Когда это уместно: разовая вычитка для расследования, чтение хвоста при отладке, строгий контроль порядка обработки, свой внешний стор смещений рядом с транзакцией в базе. В последнем случае смещение коммитится вместе с данными, и получается ровно однократная обработка на своей стороне.
Что теряется: автоматическая перебалансировка, подхват партиций при падении инстанса, готовый лаг по группе в мониторинге. Партиция, закреплённая за упавшим процессом, просто перестанет читаться, пока его не поднимут.
Где спотыкаются
Говорят «без группы быстрее» или наоборот «медленнее». Скорость чтения от группы не зависит: это тот же Fetch с того же лидера. Группа влияет на координацию и отказоустойчивость, а не на пропускную способность.
Смешивают ручное назначение партиций и подписку на топик в одном потребителе. Если партиции назначены руками, подписка по имени топика в этом же клиенте не работает, и расширение топика новыми партициями вы не заметите: часть трафика молча уйдёт мимо.
Забывают, что без группы смещение негде хранить. Коммит в служебный топик без идентификатора группы недоступен, и после рестарта чтение начнётся с начала или с конца, смотря как настроено. Позицию нужно писать в свою базу и восстанавливать при старте.