Как устроена архитектура консюмера?
Консюмер — это клиент Kafka, который подписывается на топики и читает сообщения, используя Kafka Consumer API. Потребители могут быть объединены в группы (Consumer Groups).
Ключевые характеристики
- «Smart» консюмер — консюмер сам управляет чтением и обработкой
- Pull-модель — консюмер опрашивает Kafka, а не получает push
- Гарантия обработки — консюмер отвечает за подтверждение обработки (commit offset)
- Автоматический фейловер в консюмер-группе
- Независимая обработка разными консюмер-группами
Consumer Group
Kafka использует концепцию Consumer Groups для параллельной обработки данных из топиков. Каждый потребитель в группе обрабатывает только часть данных.
- Все сообщения из топика делятся между потребителями в группе
- Каждая партиция обрабатывается только одним потребителем в группе
- При выходе из строя потребителя его партиции автоматически перераспределяются (rebalancing)
Offset (Смещение)
Потребитель отслеживает offset каждой партиции, чтобы знать, с какого сообщения продолжать чтение. Offset — это уникальный идентификатор сообщения в партиции. Потребители могут хранить offset в Kafka или вне её (в БД, файловой системе). При отключении потребитель возобновляет обработку с сохранённого offset.
Poll (Опрос)
Потребители используют метод poll() для опроса Kafka на наличие новых сообщений. Потребитель указывает тайм-аут, после которого poll() вернёт пустой результат, если сообщений нет.
Процесс работы
- Инициализация — подключение к брокерам и присоединение к consumer group
- Подписка — вызов
subscribe()на нужные топики - Опрос — вызов
poll()для получения новых сообщений - Обработка — извлечение и обработка полезной информации
- Подтверждение — вызов
commit()для обновления offset - Обработка ошибок — повторные попытки при необходимости
- Завершение — выход из consumer group и закрытие соединения
На собеседовании: ключевой вопрос — разница между auto-commit и manual commit. Auto-commit (
enable.auto.commit=true) проще, но может привести к потере или дублированию сообщений. Manual commit даёт полный контроль:commitSync()— надёжно, но медленно;commitAsync()— быстро, но без гарантии.