Golang中使用kafka
golang中比较好用的kafka client有
其中 sarama的使用者应该是最多的, 然后还有一个sarama的cluster版本 sarama-cluster
本文简单描述下sarama的一些简单使用
生产者接口#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | func producer_test() { fmt.Printf("producer_test\n") config := sarama.NewConfig() config.Producer.RequiredAcks = sarama.WaitForAll config.Producer.Partitioner = sarama.NewRandomPartitioner config.Producer.Return.Successes = true config.Producer.Return.Errors = true config.Version = sarama.V0_11_0_2 producer, err := sarama.NewAsyncProducer([]string{"localhost:9092"}, config) if err != nil { fmt.Printf("producer_test create producer error :%s\n", err.Error()) return } defer producer.AsyncClose() // send message msg := &sarama.ProducerMessage{ Topic: "kafka_go_test", Key: sarama.StringEncoder("go_test"), } value := "this is message" for { fmt.Scanln(&value) msg.Value = sarama.ByteEncoder(value) fmt.Printf("input [%s]\n", value) // send to chain producer.Input() <- msg select { case suc := <-producer.Successes(): fmt.Printf("offset: %d, timestamp: %s", suc.Offset, suc.Timestamp.String()) case fail := <-producer.Errors(): fmt.Printf("err: %s\n", fail.Err.Error()) } } } |
消费者接口#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | func consumer_test() { fmt.Printf("consumer_test") config := sarama.NewConfig() config.Consumer.Return.Errors = true config.Version = sarama.V0_11_0_2 // consumer consumer, err := sarama.NewConsumer([]string{"localhost:9092"}, config) if err != nil { fmt.Printf("consumer_test create consumer error %s\n", err.Error()) return } defer consumer.Close() partition_consumer, err := consumer.ConsumePartition("kafka_go_test", 0, sarama.OffsetOldest) if err != nil { fmt.Printf("try create partition_consumer error %s\n", err.Error()) return } defer partition_consumer.Close() for { select { case msg := <-partition_consumer.Messages(): fmt.Printf("msg offset: %d, partition: %d, timestamp: %s, value: %s\n", msg.Offset, msg.Partition, msg.Timestamp.String(), string(msg.Value)) case err := <-partition_consumer.Errors(): fmt.Printf("err :%s\n", err.Error()) } } } |
元数据接口#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | func metadata_test() { fmt.Printf("metadata test\n") config := sarama.NewConfig() config.Version = sarama.V0_11_0_2 client, err := sarama.NewClient([]string{"localhost:9092"}, config) if err != nil { fmt.Printf("metadata_test try create client err :%s\n", err.Error()) return } defer client.Close() // get topic set topics, err := client.Topics() if err != nil { fmt.Printf("try get topics err %s\n", err.Error()) return } fmt.Printf("topics(%d):\n", len(topics)) for _, topic := range topics { fmt.Println(topic) } // get broker set brokers := client.Brokers() fmt.Printf("broker set(%d):\n", len(brokers)) for _, broker := range brokers { fmt.Printf("%s\n", broker.Addr()) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库