Ответ
Группа потребителей (consumer group) — это концепция в системах обмена сообщениями (брокерах сообщений), которая позволяет нескольким процессам-потребителям (консьюмерам) совместно обрабатывать сообщения из одного или нескольких топиков.
Основные цели и преимущества:
-
Масштабирование обработки: Нагрузка по чтению сообщений из партиций топика распределяется между всеми участниками одной группы. Если в топике 10 партиций, а в группе 5 консьюмеров, то каждый из них будет обрабатывать по 2 партиции. Это позволяет горизонтально масштабировать обработку данных.
-
Отказоустойчивость: Если один из консьюмеров в группе выходит из строя, брокер (например, Kafka) запускает процесс ребалансировки (rebalancing). Партиции, которые обрабатывал упавший консьюмер, автоматически перераспределяются между оставшимися активными участниками группы. Это обеспечивает непрерывность обработки сообщений.
-
Гарантия доставки: Kafka гарантирует, что каждое сообщение из партиции будет доставлено только одному консьюмеру в рамках одной группы.
Пример использования с Sarama для Kafka на Go:
// handler реализует интерфейс sarama.ConsumerGroupHandler
// В методах Setup, Cleanup и ConsumeClaim определяется логика обработки сообщений
handler := &ConsumerGroupHandler{}
// Создание и запуск консьюмера в группе
consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
if err != nil {
log.Fatalf("Ошибка создания consumer group: %v", err)
}
// Consume запускает бесконечный цикл, который слушает сообщения
// и вызывает методы handler'а при их получении.
err = consumer.Consume(ctx, topics, handler)
if err != nil {
log.Fatalf("Ошибка при потреблении сообщений: %v", err)
}