"github.com/confluentinc/confluent-kafka-go/kafka"
func RunConsumer(config *KafkaConf) error {
configMap := &kafka.ConfigMap{
"bootstrap.servers": config.BootstrapServers,
"security.protocol": config.Protocol,
"group.id": config.Consumer.GroupId,
"auto.offset.reset": config.Consumer.AutoOffsetRest,
"enable.auto.commit": strconv.FormatBool(config.Consumer.AutoCommit),
if err := configMap.SetKey("debug", "ALL"); err != nil {
if config.Sasl.Enabled {
configMap.SetKey("sasl.mechanism", config.Sasl.Mechanism)
configMap.SetKey("sasl.username", config.Sasl.UserName)
configMap.SetKey("sasl.password", config.Sasl.Password)
consumer, err := kafka.NewConsumer(configMap)
err = consumer.SubscribeTopics([]string{config.Topic}, nil)
for count := 0; count < 10; {
event := consumer.Poll(1000)
switch msg := event.(type) {
if !config.Consumer.AutoCommit {
tps, err := consumer.Commit()
fmt.Printf("Commit offsets failed. %s\n", err.Error())
fmt.Printf("Offset commited: \n")
for _, tp := range tps {
fmt.Printf("\t%s-%d: %d", *tp.Topic, tp.Partition, tp.Offset)
func handleMessage(msg *kafka.Message) {
fmt.Printf("Consumed a message from topic %s [%d] at offset %d. key: (%s), value: (%s), Headers: ",
*msg.TopicPartition.Topic, msg.TopicPartition.Partition, msg.TopicPartition.Offset, msg.Key, msg.Value)
for _, header := range msg.Headers {
fmt.Printf("%s->%s,", header.Key, header.Value)