Что такое consumer group в брокерах сообщений
Что проверяют
Понимаете ли вы, чем модель раздачи общего лога между читателями отличается от классической очереди, и не путаете ли термины разных брокеров. Для go-разработчика это ещё и выбор клиента: в sarama группа собирается руками через обработчик сессии, в kafka-go достаточно поля конфигурации.
Как отвечать
Consumer group в Kafka это множество потребителей с общим идентификатором, между которыми брокер делит партиции топика. Одна партиция в каждый момент принадлежит одному участнику, поэтому масштабируемся мы до числа партиций, а порядок сообщений сохраняется в пределах партиции. Смещение хранится на брокере отдельно для каждой группы, поэтому новая группа читает тот же топик заново и независимо от старой.
Полезно сказать, что прямого аналога нет везде. В RabbitMQ групп не существует: несколько потребителей висят на одной очереди и разбирают сообщения наперегонки, брокер подтверждает каждое сообщение отдельно и умеет вернуть неподтверждённое в очередь. В NATS JetStream роль группы играет durable consumer с общей доставкой.
r := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"kafka:9092"},
GroupID: "billing-worker",
Topic: "payments",
})
for {
m, err := r.FetchMessage(ctx)
if err != nil {
return err
}
if err := handle(ctx, m); err != nil {
continue
}
r.CommitMessages(ctx, m)
}Где спотыкаются
Описывают распределение по сообщениям: десять сообщений на пять потребителей, каждому по два. Делятся партиции, а не сообщения, и если потребителей больше, чем партиций, лишние просто простаивают.
Переносят на Kafka повадки очереди и ждут, что необработанное сообщение уйдёт соседу или в dead letter. Ни того, ни другого нет: смещение двигает сам потребитель, а очередь для битых сообщений заводится в приложении.
Забывают про горутины. Обработку запускают параллельно, а коммит делают по завершении любой из них, и при падении часть партии теряется: коммит подтверждает все сообщения до указанного смещения, а не одно конкретное.