繁体   English   中英

如何使用 Segmentio 的 kafka-go 创建 Kafka 主题?

[英]How to create Kafka topic using Segmentio's kafka-go?

我可以得到一个使用segmentio的kafka-go创建主题的例子吗?

我尝试创建如下主题:

c, _ := kafka.Dial("tcp", "host:port")
kt := kafka.TopicConfig{Topic: "sometopic", NumPartitions: 1, ReplicationFactor: 1}
e := c.CreateTopics(kt)

但这只有在给定的host:port是 Kafka Leader 时才有效。 如果host:port不是 Kafka Leader,那么我将收到此错误:

不是 Controller:这不是此集群的正确 controller*

传递集群地址以创建主题的正确方法是什么?

卡夫卡分段: github.com/segmentio/kafka-go

这就是你需要的:

func (c *Conn) Controller() (broker Broker, err error)
// Controller requests kafka for the current controller and returns its URL

当您使用 Dial 在代码中打开连接时,您会随机选择集群中的一个代理。 因此,您可能/可能不会最终使用实际的 Kafka controller。 对 controller 进行简单查找并打开新连接应该会有所帮助。

https://pkg.go.dev/github.com/segmentio/kafka-go?tab=doc#Conn.Controller

就像 shmsr 说的 - 你需要获得领导者连接才能创建主题。 您可以通过以下方式执行此操作:

conn, err := kafka.Dial("tcp", "host:port")
if err != nil {
    panic(err.Error())
}
defer conn.Close()

controller, err := conn.Controller()
if err != nil {
    panic(err.Error())
}
controllerConn, err := kafka.Dial("tcp", net.JoinHostPort(controller.Host, strconv.Itoa(controller.Port)))
if err != nil {
    panic(err.Error())
}
defer controllerConn.Close()

topicConfigs := []kafka.TopicConfig{Topic: "sometopic", NumPartitions: 1, ReplicationFactor: 1}}

err = controllerConn.CreateTopics(topicConfigs...)
if err != nil {
    panic(err.Error())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM