Kafka различает консюмеры внутри одной группы с помощью уникальных идентификаторов. Вот ключевые аспекты, которые определяют различие между консюмерами:
1. Group ID (Идентификатор группы)
- Каждый консюмер принадлежит группе консюмеров, которая определяется уникальным идентификатором
Group ID.
- Все консюмеры с одинаковым
Group ID обрабатывают сообщения в рамках одной группы и совместно делят между собой партиции топика.
2. Consumer Instance ID
- Каждый консюмер внутри группы имеет уникальный идентификатор Instance ID. Он автоматически генерируется клиентской библиотекой или может быть задан вручную при настройке консюмера.
- В случае с Sarama и другими клиентами, этот ID может быть строкой, отражающей хост или имя процесса.
3. Уникальный идентификатор на основе протокола
При соединении с Kafka, консюмеры используют протокол, который генерирует уникальный идентификатор. Вот как это происходит:
- Client ID:
- Идентификатор клиента, задаваемый в настройках конфигурации. Он может быть одинаковым для всех консюмеров или уникальным.
- Не влияет на балансировку внутри группы, но используется для мониторинга.
- Member ID:
- Уникальный идентификатор, который генерирует Kafka-брокер для каждого консюмера в группе при соединении.
- Это ключевой параметр, который позволяет брокеру различать консюмеров во время согласования ребаланса.
4. Механизм Heartbeat
- Консюмеры регулярно отправляют сообщения Heartbeat брокеру. Это подтверждает, что консюмер всё ещё активен и готов принимать сообщения.
- Если консюмер прекращает отправлять Heartbeat (например, из-за ошибки или завершения работы), Kafka удаляет его из группы.
Пример: Как это работает
- Допустим, есть топик с 6 партициями и группа консюмеров с
Group ID = my-consumer-group.
- В группу подключаются 3 консюмера:
consumer-1 (сгенерирован ID: member1),
consumer-2 (сгенерирован ID: member2),
consumer-3 (сгенерирован ID: member3).
- Kafka распределяет партиции между этими консюмерами:
consumer-1 получает партиции P0 и P1.
consumer-2 получает партиции P2 и P3.
consumer-3 получает партиции P4 и P5.
- Если
consumer-2 отключится, Kafka начнёт ребалансировку:
- Партиции
P2 и P3 будут перераспределены между consumer-1 и consumer-3.
Итог
Kafka различает консюмеров внутри одной группы через:
- Member ID: уникальный идентификатор участника группы, сгенерированный Kafka.
- Client ID: идентификатор клиента (опционально задаётся вручную).
- Heartbeat: механизм, позволяющий следить за активностью консюмеров.
Эти механизмы обеспечивают корректное распределение партиций и позволяют избежать конфликтов между консюмерами.