一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
[使用sarama向kafka投递任务]()
[前言]()
[sarama的下载]()
[启动kafka环境]()
[启动一个kafka消费者接受任务]()
[go代码编写]()
[步骤总览]()
[完整代码]()
[运行代码,查看效果]()
使用sarama向kafka投递任务
前言
当了解我zookeeper和kafka,并且将它们成功启动后。可以尝试向kafka进程中投递任务了,这里使用的编程语言是golang,涉及的golang库是:github.com/Shopify/sarama
。sarama
是一个监听apache kafka的golang客户端库。
sarama的下载
下载命令go get github.com/Shopify/sarama
如果出错,可以尝试换一下go代理,命令行中:
go env -W GOPROXY=https://goproxy.cn
如若是其他错误,尝试粘贴错误信息百度一下。
启动kafka环境
-
zookeeper
进入到zookeeper解压目录,运行系统对应的
zkServer
,win系统运行bin/zkServer.cmd
,linux系统运行zkServer.sh
。kafka启动需要依赖zookeeper,所以必须先启动了zookeeper -
kafka
同样进入到kafka的解压目录下,运行对应的服务指定服务配置文件。win下运行(在解压的根目录下):bin/windows/kafka-server-start.bat config/server.properties
,linux下的文件在bin/zookeeper-server-start.sh config/server.properties
启动一个kafka消费者接受任务
进入kafka的bin
目录,根据系统运行对应的kafka-console-consumer
文件,win在bin/windows/
,linux在bin/
。运行是需要带上连接地址
和topic号
,如下例子,topic为shopping
启动之后会阻塞,然后我们就可以去投递任务了。
go代码编写
步骤总览:
- 定义kafka配置
- 构建消息结构体
- 连接kafka
- 发送消息
定义kafka配置
配置类可以通过sarama.NewConfig()
获取。初始化主要做的事情有两个,1. 选择分区、2.设置成功投递后channel的返回。记得引入sarama。
/*记得引入sarama。 import("github.com/Shopify/sarama") */
config := sarama.NewConfig()
// 1. 初始化生产者配置
config.Producer.RequiredAcks = sarama.WaitForAll
// 选择分区
config.Producer.Partitioner = sarama.NewRandomPartitioner
// 成功交付的信息
config.Producer.Return.Successes = true
构建消息结构体
同样的sarama已经定义了结构体了,需要赋值的是Topic和Value(具体值),如下:
// 2. 构造一个消息,结构体类型
msg := &sarama.ProducerMessage{
Topic: "shopping",
Value: sarama.StringEncoder("20220411happy03"),
}
连接kafka
使用sarama.NewSyncProducer
将配置文件传入即可。打开连接和关闭连接必须成对
// 3. 连接kafka
client, err := sarama.NewSyncProducer([]string{"127.0.0.1:9092"}, config)
if err != nil {
fmt.Println(err)
}
defer client.Close()
发送消息(投递任务)
client.SendMessage(msg)
返回值有3个,第一个是数据所在分区,第二个是数据的偏移量,第三个是错误信息,无错误返回nil
// 4. 发送消息
partition, offset, err := client.SendMessage(msg)
fmt.Println("所在分区:")
fmt.Println(partition)
fmt.Println("数据偏移量:")
fmt.Println(offset)
if err != nil {
fmt.Println(err)
}
完整代码
package main
import (
"fmt"
"github.com/Shopify/sarama"
)
func main() {
config := sarama.NewConfig()
// 1. 初始化生产者配置
config.Producer.RequiredAcks = sarama.WaitForAll
// 选择分区
config.Producer.Partitioner = sarama.NewRandomPartitioner
// 成功交付的信息
config.Producer.Return.Successes = true
// 2. 构造一个消息,结构体类型
msg := &sarama.ProducerMessage{
Topic: "shopping",
Value: sarama.StringEncoder("20220411happy02"),
}
// 3. 连接kafka
client, err := sarama.NewSyncProducer([]string{"127.0.0.1:9092"}, config)
if err != nil {
fmt.Println(err)
}
defer client.Close()
// 4. 发送消息
partition, offset, err := client.SendMessage(msg)
fmt.Println("partition:")
fmt.Println(partition)
fmt.Println("offset:")
fmt.Println(offset)
if err != nil {
fmt.Println(err)
}
}