1. sarama 是什么?
sarama 的出现意味着,golang 有完整的 apache kafka 客户端文档的全部用例了
2. 为什么那么受欢迎?
他完整,兼容性好
不需要 CGO 的支持
支持的 golang 版本从 1.15 到目前最新的 1.16
支持的 kafka 版本横跨 2.6 到 2.8,并且之前发布的老版本依然支持
3. 怎么使用
下载扩展库 go get github.com/Shopify/sarama
即可。
安装完首先在 test 中写一个队列任务发布者:kafka 的集群,自己用 docker 在 wsl 下搭建就行了,网上例子非常多,这里就不详细解答了
请看我代码逐行解释:
package tester
import (
"fmt"
"github.com/Shopify/sarama"
"log"
"os"
"testing"
"time"
)
//集群地址
var address = []string{"192.168.83.89:19092","192.168.83.89:29092","192.168.83.89:39092"}
//创建kafka任务发布者
func TestKafkaProducter(t *testing.T) {
//配置发布者
config := sarama.NewConfig()
//确认返回,记得一定要写,因为本次例子我用的是同步发布者
config.Producer.Return.Successes = true
//设置超时时间 这个超时时间一旦过期,新的订阅者在这个超时时间后才创建的,就不能订阅到消息了
config.Producer.Timeout = 5 * time.Second
//连接发布者,并创建发布者实例
p, err := sarama.NewSyncProducer(address, config)
if err != nil {
log.Printf("sarama.NewSyncProducer err, message=%s \n", err)
return
}
//程序退出时释放资源
defer p.Close()
//设置一个逻辑上的分区名,叫安彦飞
topic := "anyanfei"
//这个是发布的内容
srcValue := "sync: this is a message. index=%d"
//发布者循环发送0-9的消息内容
for i:=0; i<10; i++ {
value := fmt.Sprintf(srcValue, i)
//创建发布者消息体
msg := &sarama.ProducerMessage{
Topic:topic,
Value:sarama.ByteEncoder(value),
}
//发送消息并返回消息所在的物理分区和偏移量
partition, offset, err := p.SendMessage(msg)
if err != nil {
log.Printf("send message(%s) err=%s \n", value, err)
}else {
fmt.Fprintf(os.Stdout, value + "发送成功,partition=%d, offset=%d \n", partition, offset)
}
time.Sleep(500*time.Millisecond)
}
}
我们开始来创建订阅者,俗称消费者:同样是在 tester 包下进行编写,测试用嘛(一定要注意,实际项目中不能用