Kafka:客户的可用经纪人用完了

时间:2019-04-26 12:45:29

标签: go apache-kafka sarama

更新:事实证明我在Docker中的端口有问题。不知道为什么能解决这个问题。

我相信我遇到了一个奇怪的错误。我正在使用Sarama库,并且能够成功创建使用者。

func main() {
 config = sarama.NewConfig()
 config.ClientID = "go-kafka-consumer"
 config.Consumer.Return.Errors = true
 // Create new consumer
 master, err := sarama.NewConsumer("localhost:9092", config)
 if err != nil {
    panic(err)
 }

 defer func() {
     if err := master.Close(); err != nil {
         panic(err)
     }
 }()

 partitionConsumer, err := master.ConsumePartition("myTopic",0, 
 sarama.OffsetOldest)
 if err != nil {
     panic(err)
 }
}

一旦我将这段代码分解并移出主例程,就会遇到错误:

  

kafka:客户端的可用代理用完了(您的集群是否可以访问?)

我将代码拆分如下​​:以前的main()方法现在已经通过称为NewConsumer()的方法转换为使用者程序包,而我的new main()则像下面这样调用NewConsumer():

c := consumer.NewConsumer()

恐慌语句在sarama.NewConsumer行中触发,并打印出kafka: client has run out of available brokers to talk to (Is your cluster reachable?)

为什么以这种方式破坏我的代码会导致Sarama无法成为消费者? Sarama是否需要直接从main运行?

1 个答案:

答案 0 :(得分:2)

认为您以这种方式创建了2个或更多的消费者,这些消费者被分组为一个组(可能是go-kafka-consumer)。您的经纪人有一个带有1个分区的主题,因此分配了一个组,另一个生成了此错误消息。如果将该主题的分区提高到2,该错误将消失。 但是我认为您的问题是,您以某种方式实例化了比以前更多的消费者。

来自Kafka in a Nutshell

  

也可以将消费者分为给定主题的消费者组-该组中的每个消费者都从一个唯一的分区中读取内容,整个组将整个主题中的所有消息都消费掉。 如果使用者的使用者多于分区,则某些使用者将因为它们没有要读取的分区而处于空闲状态。如果使用者的分区多于使用者,则使用者将从多个分区接收消息。如果您具有相同数量的使用者和分区,则每个使用者都从一个分区中按顺序读取消息。

他们不会完全产生错误,所以Sarama会遇到问题。