kafka 生产 - 消费 场景模拟
系统:linux centos
语言:golang
安装
2、安装步骤&实践案例
以下命令请根据实际路径
# 步骤 1:获取 KAFKA
tar -xzf kafka_2.13-3.4.0.tgz
cd kafka_2.13-3.4.0
# 步骤2:启动KAFKA环境
bin/zookeeper-server-start.sh config/zookeeper.properties # 开启zookeeper服务
bin/kafka-server-start.sh config/server.properties # 打开另一个终端会话,开启kafka服务
# 或者 后台运行
nohup bin/zookeeper-server-start.sh config/zookeeper.properties > zookeeper.log 2>&1 &
nohup bin/kafka-server-start.sh config/server.properties > kafka.log 2>&1 &
# 打开另一个终端会话
# 在编写第一个事件之前,必须创建一个主题 quickstart-events
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
# 步骤 3:创建主题来存储您的事件
# 显示 主题的 分区数等详细信息:
[root@VM-12-13-centos kafka_2.13-3.4.0]# bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
[root@VM-12-13-centos kafka_2.13-3.4.0]# Topic: quickstart-events TopicId: nZ5INgfFTqm5zgSSwKOpTA PartitionCount: 1 ReplicationFactor: 1 Configs:
[root@VM-12-13-centos kafka_2.13-3.4.0]# Topic: quickstart-events Partition: 0 Leader: 0 Replicas: 0 Isr: 0
# 步骤 4:将一些事件写入主题
[root@VM-12-13-centos kafka_2.13-3.4.0]# bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
> This is my first event # 输入
> This is my second event # 输入
# 第 5 步:阅读事件 [消费]
bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
3、代码实践
- 生产者
package main import ( "bufio" "fmt" "os" "github.com/IBM/sarama" ) func main() { config := sarama.NewConfig() config.Producer.RequiredAcks = sarama.WaitForAll config.Producer.Return.Successes = true msg := &sarama.ProducerMessage{} // 构建消息 msg.Topic = "new_topic" msg.Partition = int32(0) // 连接kafka producer, err := sarama.NewSyncProducer([]string{"127.0.0.1:9092"}, config) if err != nil { fmt.Println("producer close, err: " + err.Error()) return } defer producer.Close() for { fmt.Print("请输入: ") reader := bufio.NewReader(os.Stdin) text, _ := reader.ReadString('\n') msg.Value = sarama.StringEncoder(string(text)) fmt.Printf("您输入的是: %v, %v", string(text), text) fmt.Println() // 发送消息 partition, offset, err := producer.SendMessage(msg) if err != nil { fmt.Println("send msg failed, err: " + err.Error()) return } fmt.Printf("partiotion: %v, offset: %v", partition, offset) fmt.Println() if string(text) == "exit\n" { return } } }
- 消费者
package main import ( "fmt" "time" "github.com/IBM/sarama" ) func main() { consumer, err := sarama.NewConsumer([]string{"127.0.0.1:9092"}, nil) if err != nil { fmt.Println("fail to start consumer, err: " + err.Error()) return } topic := "new_topic" partitioner := int32(0) // 指定分区 partitionConsumer, err := consumer.ConsumePartition(topic, partitioner, sarama.OffsetNewest) if err != nil { fmt.Println("fail to start consumer for partioner, err: " + err.Error()) return } defer partitionConsumer.AsyncClose() for { for msg := range partitionConsumer.Messages() { fmt.Printf("Partition: %v,Offset: %v,Key: %v,Value: %v", msg.Partition, msg.Offset, msg.Key, string(msg.Value)) fmt.Println() if string(msg.Value) == "exit\n" { return } } time.Sleep(2 * time.Microsecond) } }
- 4、演示
- 生产者
[root@VM-12-13-centos kafkaP]# go run main.go 请输入: 水电费可接受的九分裤 您输入的是: 水电费可接受的九分裤 , 水电费可接受的九分裤 partiotion: 0, offset: 8 请输入: 士大夫撒解放路卡就是了 您输入的是: 士大夫撒解放路卡就是了 , 士大夫撒解放路卡就是了 partiotion: 0, offset: 9 请输入: exit 您输入的是: exit , exit # 输入 exit 消息就退出
- 消费者
[root@VM-12-13-centos kafkaC]# go run main.go Partition: 0,Offset: 7,Key: [],Value: 第三方黄金三 Partition: 0,Offset: 8,Key: [],Value: 水电费可接受的九分裤 Partition: 0,Offset: 9,Key: [],Value: 士大夫撒解放路卡就是了 Partition: 0,Offset: 10,Key: [],Value: exit # 接收到 exit 消息就退出
- 生产者