项目简介
producer.go是一个基于kafka-go库的示例生产者程序,可以向Kafka集群发送消息,并且支持异步发送。它从标准输入读取消息,并将其作为Kafka消息发送到指定主题的分区。
consumer.go是一个基于kafka-go库的示例消费者程序,可以从Kafka集群中消费消息,并打印在终端上。它支持异步消费和处理来自多个分区的消息。此外,它还支持设置消费组ID和从最新或最早的消息偏移量开始消费。
关于Kafka
Kafka是一个高吞吐量的分布式消息队列,它能够处理来自多个生产者的大量消息,并将这些消息传递给多个消费者。它的主要作用是用于消息传递和日志处理。在数据处理、数据分析、数据挖掘等领域,Kafka已经成为一个很受欢迎的消息队列和数据流平台,因为它能够支持海量数据的高效处理,具有高吞吐量、低延迟、可扩展性和可靠性等优点。
项目代码
- consumer.go
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"github.com/segmentio/kafka-go"
)
func main() {
// 设置 Kafka 连接参数
topic := "test-topic"
broker1 := "localhost:9092"
broker2 := "localhost:9093"
partition := 0
// 建立 Kafka 消费者连接
consumerConn, err := kafka.DialLeader(context.Background(), "tcp", broker1, topic, partition)
if err != nil {
log.Fatal("failed to dial leader:", err)
}
defer consumerConn.Close()
// 开始消费消息
consumer := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{
broker1, broker2},
Topic: topic,
Partition: partition,
MinBytes: 10e3, // 最小字节数
MaxBytes: 10e6, // 最大字节数
})
defer consumer.Close()
signals := make(chan os.Signal, 1)
signal.Notify(signals, os.Interrupt)
for {
select {
case <-signals:
fmt.Println("interrupt signal received")
return
default:
msg, err := consumer.FetchMessage(context.Background())
if err != nil {
log.Fatal("failed to fetch message:", err)
}
fmt.Printf("message at offset %d: %s = %s\n", msg.Offset, string(msg.Key), string(msg.Value))
}
}
}
- producer.go
package main
import (
"bufio"
"context"
"fmt"
"log"
"os"
"strings"
"time"
"github.com/segmentio/kafka-go"
)
func main() {
// 设置 Kafka 连接参数
topic := "test-topic"
brokers := []string{
"localhost:9092", "localhost:9093"}
// 建立 Kafka 生产者连接
writer := &kafka.Writer{
Addr: kafka.TCP(brokers...),
Topic: topic,
Balancer: &kafka.LeastBytes{
},
Async: true,
WriteTimeout: 10 * time.Second,
}
defer writer.Close()
// 从标准输入读取消息,发送到 Kafka
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Print("Enter message: ")
scanner.Scan()
message := scanner.Text()
if strings.ToLower(message) == "exit" {
break
}
err := writer.WriteMessages(context.Background(), kafka.Message{
Key: []byte("key"),
Value: []byte(message),
})
if err != nil {
log.Fatal("failed to write message:", err)
}
}
}
项目运行效果
- 生产者
- 消费者