为什么Shopify Sarama使用者需要分区来消费消息

时间:2017-05-31 08:47:28

标签: go apache-kafka sarama

我很抱歉发布了与卡夫卡图书馆有关的问题,因为没有多少人对图书馆的具体问题感兴趣。但是这个库是golang-Kafka实现中最常用的库之一。

我想使用Sarama库创建一个简单的消费者,该库可以监听主题。据我所知,在高级Kafka API中,默认情况下,如果未指定特定分区,则使用者会侦听所有主题分区。但是,在此库中,Consumer接口只有ConsumePartition函数,其中分区是必需的参数。功能的签名是:

ConsumePartition(topic string, partition int32, offset int64) (PartitionConsumer, error) 

这让我有点困惑。有谁工作过吗?

另外,我有一个关于卡夫卡的基本问题。如果我有一个由3个消费者实例组成的消费者组,并且他们正在听取2个主题,每个主题有2个分区,那么我是否需要具体提到哪个消费者实例将使用哪个分区或Kafka Fetch API将采用根据负载自己照顾它?

2 个答案:

答案 0 :(得分:3)

我使用sarama-cluster,它是Sarama的开源扩展(也由Shopify Sarama推荐)。
借助Sarama集群,您可以使用以下API创建使用者:

cluster.NewConsumer(brokers, consumerGroup, topics, kafkaConfig)

因此不需要分区。您只应提供Kafka brokers的地址,consumer group的名称以及您希望使用的topics


Consumers handling

要维持顺序,您应该只为每个分区分配一个使用者。
因此,如果您的消费者组中有3个消费者,并且您希望他们消费2个主题,每个主题有2个分区,则应按以下方式分配:

partitions 1,2 -> consumer A  
partition 3 -> consumer B  
partition 4 -> consumer C 

您可能最终会导致其中一位消费者前进得更快(其中一个主题具有更高的吞吐量),因此您需要重新平衡。
建议使用一个库(例如sarama-cluster)来为您处理。

答案 1 :(得分:0)

与此同时,Sarama 集群项目已弃用,请参阅其存储库中的 Deprecation Notice。好消息是它已被弃用,取而代之的是 PR Implement a higher-level consumer group #1099, 它专注于使用主题而不是专用分区。

官方 sarama 存储库中的 examples/ 文件夹提供了一个很好的 Consumer Group Implementation Example。它就像一个魅力,不需要在 Sarama 之上的任何额外的库。

预览:

config := sarama.NewConfig()
client, err := sarama.NewConsumerGroup(strings.Split(brokers, ","), "mygroup", config)
client.Consume(ctx, strings.Split(topics, ","), &consumer) // should run in a loop