Gymterview
middle

Как устроена архитектура консюмера?

Консюмер — это клиент 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() вернёт пустой результат, если сообщений нет.

Процесс работы

  1. Инициализация — подключение к брокерам и присоединение к consumer group
  2. Подписка — вызов subscribe() на нужные топики
  3. Опрос — вызов poll() для получения новых сообщений
  4. Обработка — извлечение и обработка полезной информации
  5. Подтверждение — вызов commit() для обновления offset
  6. Обработка ошибок — повторные попытки при необходимости
  7. Завершение — выход из consumer group и закрытие соединения

На собеседовании: ключевой вопрос — разница между auto-commit и manual commit. Auto-commit (enable.auto.commit=true) проще, но может привести к потере или дублированию сообщений. Manual commit даёт полный контроль: commitSync() — надёжно, но медленно; commitAsync() — быстро, но без гарантии.