如何使用Sarama在多个goroutine中从Kafka主题消费?

时间:2019-07-04 17:49:32

标签: go apache-kafka kafka-consumer-api goroutine sarama

我使用https://github.com/Shopify/sarama与Kafka进行互动。我有一个主题,例如, 100个分区。我有应用程序,该应用程序已部署在 1个主机上。因此,我想在多个goroutine中使用该主题。

我看到了这个示例-https://github.com/Shopify/sarama/blob/master/examples/consumergroup/main.go,在该示例中,我们可以看到如何在特定的消费者组中创建消费者。

所以,我的问题是,我应该创建多个此类消费者,还是在Sarama中进行一些设置,在其中可以设置所需数量的消费者goroutine。

P.S。我看到了这个问题-https://github.com/Shopify/sarama/issues/140-但没有答案,如何创建MultiConsumer

1 个答案:

答案 0 :(得分:2)

此示例显示了一个完全正常工作的控制台应用程序,该应用程序可以使用一个主题中的所有分区,每个分区创建一个goroutine:

https://github.com/Shopify/sarama/blob/master/tools/kafka-console-consumer/kafka-console-consumer.go

它被链接到您在问题中发布的主题的末尾。

它基本上可以创建一个消费者:

c, err := sarama.NewConsumer(strings.Split(*brokerList, ","), config)

然后获取所需主题的所有分区:

func getPartitions(c sarama.Consumer) ([]int32, error) {
    if *partitions == "all" {
        return c.Partitions(*topic)
    }
...

然后为每个分区创建一个PartitionConsumer并在不同的goroutine中从每个分区进行消费:

for _, partition := range partitionList {
    pc, err := c.ConsumePartition(*topic, partition, initialOffset)
    ....

    wg.Add(1)
    go func(pc sarama.PartitionConsumer) {
        defer wg.Done()
        for message := range pc.Messages() {
            messages <- message
        }
    }(pc)

}