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: механизм, позволяющий следить за активностью консюмеров.
Эти механизмы обеспечивают корректное распределение партиций и позволяют избежать конфликтов между консюмерами.