更新:事实证明我在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运行?
答案 0 :(得分:2)
我认为您以这种方式创建了2个或更多的消费者,这些消费者被分组为一个组(可能是go-kafka-consumer
)。您的经纪人有一个带有1个分区的主题,因此分配了一个组,另一个生成了此错误消息。如果将该主题的分区提高到2,该错误将消失。
但是我认为您的问题是,您以某种方式实例化了比以前更多的消费者。
也可以将消费者分为给定主题的消费者组-该组中的每个消费者都从一个唯一的分区中读取内容,整个组将整个主题中的所有消息都消费掉。 如果使用者的使用者多于分区,则某些使用者将因为它们没有要读取的分区而处于空闲状态。如果使用者的分区多于使用者,则使用者将从多个分区接收消息。如果您具有相同数量的使用者和分区,则每个使用者都从一个分区中按顺序读取消息。
他们不会完全产生错误,所以Sarama会遇到问题。