Kafka Go客户端--Sarama

第一节:kafka golang sarama初体验 关于Kafka的开发库,以Java的居多,Golang语言的开发库,主要推荐的是sarama项目地址:这个项目之前地址是https://github.com/Shopify/sarama 通过源地址也可以访问本节,我们简单通过golang语言,操作sarama.NewClient对象,查询了kafka集群的topic列表,brokers列表,控制器ID。希望大家对sarama有了初步认识。 阅读详情

Kafka Go客户端

在Go中里面有三个比较有名气的Go客户端。

  • Sarama:用户数量最多,早期这个项目是在Shopify下面,现在挪到了IBM下。
  • segmentio/kafka-go:没啥大的缺点。
  • confluent-kafka-go:需要启用cgo,跨平台问题比较多,交叉编译也不支持。

Sarama 使用入门:tools

IBM/sarama: Sarama is a Go library for Apache Kafka.

在 Sarama 里面提供了一些简单的命令行工具,可以看做是 Shell脚本提供的功能一个子集。

Consumer和 producer中的用得比较多

在这里插入图片描述

1.设置 Go 代理(如果内网无法直连 proxy.golang.org)

export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=sum.golang.google.cn

2.在虚拟机上执行安装命令:

  • ​ go install github.com/IBM/sar ama/tools/kafka-console-consumer@latest
  • ​ go install github.com/lBM/sarama/tools/kafka-console-producer@latest

3.把可执行文件所在目录加到 PATH(如果还没加)

export PATH=$PATH:$(go env GOBIN)

4.确认可执行文件在哪里

# 查看 GOBIN,如果你没显式设置,就会是空
go env GOBIN

# 查看 GOPATH,默认是 $HOME/go(对于 root 用户就是 /root/go)
go env GOPATH

#我的是/home/cxz/go/lib:/home/cxz/go/work

5.查看安装结果

ls /home/cxz/go/lib/bin
#应该能够看到kafka-console-consumer  kafka-console-producer

6.临时生效

export PATH=$PATH:/home/cxz/go/lib/bin

# 然后验证
which kafka-console-consumer
# 应该输出 /home/cxz/go/lib/bin/kafka-console-consumer

7.永久生效

echo 'export PATH=$PATH:/home/cxz/go/lib/bin' >> ~/.bashrc
# 或者,如果你用的是 zsh:
# echo 'export PATH=$PATH:/home/cxz/go/lib/bin' >> ~/.zshrc

# 然后重新加载配置
source ~/.bashrc

Sarama 使用入门:发送消息

虚拟机上执行

kafka-console-consumer -topic=test_topic -brokers=192.168.24.101:9094

Goland上执行

package main

import (
	"github.com/IBM/sarama"
	"github.com/stretchr/testify/assert"
	"testing"
)

var addrs = []string{"192.168.24.101:9094"}

func TestSyncProducer(t *testing.T) {
    //创建一个 Sarama 的配置对象。
	cfg := sarama.NewConfig()
    //表示生产者要等待 Kafka 确认消息成功写入后再返回(同步模式)。如果不设置这个,SyncProducer.SendMessage 会一直失败。
	cfg.Producer.Return.Successes = true //同步的Producer一定要设置
    //创建一个同步的生产者实例
	producer, err := sarama.NewSyncProducer(addrs, cfg)
	assert.NoError(t, err)
    //构建消息并发送
	_, _, err = producer.SendMessage(&sarama.ProducerMessage{
		Topic: "test_topic",
		//消息数据本体
		Value: sarama.StringEncoder("hello world ,这是一条使用kafka的消息"),
		//会在生产者和消费者之间传递,消息头,可传递自定义键值对,比如 trace_id 用于链路追踪。
		Headers: []sarama.RecordHeader{
			{
				Key:   []byte("trace_id"),
				Value: []byte("123456"),
			},
		},
		//只作用于发送过程。元信息,在发送过程中使用,可以用来传递额外信息,发送完成后会原样返回(不会传给消费者)。
		Metadata: "这是metadata",
	})
	assert.NoError(t, err)
}

10.执行结果

Partition:	0
Offset:	0
Key:	
Value:	hello world ,这是一条使用kafka的消息

使用控制台工具连接Kafka

Sarama 使用入门:指定分区

可以注意到,前面所有的消息都被发送到了 Partition 0 上面。

正常来说,在 Sarama 里面,可以通过指定 config 中的Partitioner来指定最终的目标分区。

常见的方法:

  • ​ Random:随机挑一个。
  • ​ RoundRobin:轮询。
  • ​ Hash(默认):根据 key 的哈希值来筛选一个。
  • ​ Manual: 根据 Message 中的 partition 字段来选择。
  • ​ ConsistentCRC:一致性哈希,用的是 CRC32 算法。
  • ​ Custom:实际上不 Custom,而是自定义一部分Hash 的参数,本质上是一个 Hash 的实现。
//默认HashPartitioner  适合: 按用户 ID、订单 ID 等字段分区场景
cfg.Producer.Partitioner = sarama.NewHashPartitioner
//使用 CRC32 算法 计算 Key 的哈希。 适合: 需要高一致性分布的业务,例如日志收集系统
cfg.Producer.Partitioner = sarama.NewConsistentCRCHashPartitioner
//忽略 Key,每条消息随机分配 partition。  适合: 普通消息队列、广播类场景。
cfg.Producer.Partitioner = sarama.NewRandomPartitioner
//需要手动指定 partition(ProducerMessage.Partition 字段)。适合: 明确知道要写哪个 partition,例如做数据分流
cfg.Producer.Partitioner = sarama.NewManualPartitioner
//用于实现你自己的 Partitioner  一般不推荐使用这个空参函数(它会 panic),应实现完整接口。
cfg.Producer.Partitioner = sarama.NewCustomPartitioner()
//允许你使用自定义哈希函数来做 key 分区。  适合: 有特定哈希策略需求时,例如分布要尽可能均匀。
cfg.Producer.Partitioner = sarama.NewCustomHashPartitioner(func() hash.Hash32 {

})



Topic: "test_topic",
//分区依据
Key:   sarama.StringEncoder("user_123"), // 🔑 这里是分区依据
//消息数据本体
Value: sarama.StringEncoder("hello world ,这是一条使用kafka的消息"),

最典型的场景,就是利用Partitioner来保证同一个业务的消息一定发送到同一个分区上,从而保证业 有序。

Sarama 使用入门:异步发送

Sarama有一个异步发送的producer,它的用法稍微复杂一点。

  • ​ 把Return.Success和 Errors都设置为true,这是为了后面能够拿到发送结果。
  • ​ 初始化异步producer。
  • ​ 从producer里面拿到Input的channel,并且发送 一条消息。
  • ​ 利用select case,同时**监听Success和Error两个channel,**来获得发送成功与否的信息。
func TestAsyncProducer(t *testing.T) {
	cfg := sarama.NewConfig()
	//怎么知道发送是否成功
	cfg.Producer.Return.Errors = true
	cfg.Producer.Return.Successes = true
	producer, err := sarama.NewAsyncProducer(addrs, cfg)
	require.NoError(t, err)
	messages := producer.Input()
	go func() {
		for {
			messages <- &sarama.ProducerMessage{
				Topic: "test_topic",
				//分区依据
				Key: sarama.StringEncoder("user_123"), // 🔑 这里是分区依据
				//消息数据本体
				Value: sarama.StringEncoder("hello world ,这是一条使用kafka的消息"),
				//会在生产者和消费者之间传递
				Headers: []sarama.RecordHeader{
					{
						Key:   []byte("trace_id"),
						Value: []byte("123456"),
					},
				},
				//只作用于发送过程
				Metadata: "这是metadata",
			}
		}
	}()

	errCh := producer.Errors()
	succCh := producer.Successes()
	for {
		//两个都不满足就会阻塞
		select {
		case err := <-errCh:
			t.Log("发送出了问题", err.Err)
		case <-succCh:
			t.Log("发送成功")
		}
	}
}

Sarama 使用入门:acks

在Kafka里面,生产者在发送数据的时候,有一个很关键的参数,就是 acks。
有三个取值:

  • ​ 0:客户端发一次,不需要服务端的确认。
  • ​ 1:客户端发送,并且需要服务端写入到主分区。
  • ​ -1:客户端发送,并且需要服务端同步到所有的ISR 上。

从上到下,性能变差,但是数据可靠性上升。需要性能,选 0,需要消息不丢失,选-1。

理解acks你就要抓住核心点,谁ack才算数?

  • 0:TCP协议返回了ack就可以。
  • 1:主分区确认写入了就可以。
  • -1:所有的ISR都确认了就可以。

在这里插入图片描述

ISR (In Sync Replicas),用通俗易懂的话来说,就是跟上了节奏的从分区。

什么叫做跟上了节奏?就是它和主分区保持了数据同步。

所以,当消息被同步到从分区之后,如果主分区崩溃了那么依旧可以保证在从分区上还有数据。

在这里插入图片描述

sarama 使用入门:启动消费者

Sarama的消费者设计不是很直观,稍微有点复杂。

  • ​ 首先要初始化一个ConsumerGroup。
  • ​ 调用ConsumerGroup上的Consume方法。
  • ​ 为 Consume 方法传入一个 ConsumerGroupHandler的辅助方法。
package main

import (
	"context"
	"github.com/IBM/sarama"
	"github.com/stretchr/testify/assert"
	"log"
	"testing"
)

func TestConsumer(t *testing.T) {
	cfg := sarama.NewConfig()
	//正常来说,一个消费者都是归属一个消费者组的
	//消费者就是你的业务
	consumerGroup, err := sarama.NewConsumerGroup(addrs, "test_group", cfg)

	assert.NoError(t, err)
	err = consumerGroup.Consume(context.Background(), []string{"test_topic"}, testConsumerGroupHandler{})
	//你消费结束,就会到这里
	t.Log(err)
}

type testConsumerGroupHandler struct {
}

func (t testConsumerGroupHandler) Setup(session sarama.ConsumerGroupSession) error {
	log.Println("Setup session:", session)
	return nil
}

func (t testConsumerGroupHandler) Cleanup(session sarama.ConsumerGroupSession) error {
	log.Println("Cleanup session:", session)
	return nil
}

func (t testConsumerGroupHandler) ConsumeClaim(
	//代表的是你和Kafka的会话(从建立连接到连接彻底断掉的那一段时间)
	session sarama.ConsumerGroupSession,
	claim sarama.ConsumerGroupClaim) error {
	msgs := claim.Messages()
	for msg := range msgs {
		//var bizMsg MyBizMsg
		//err := json.Unmarshal(msg.Value, &bizMsg)
		//if err != nil {
		//	//这就是消费消息出错
		//	//大多数时候就是重试
		//	//记录日志
		//	continue
		//}
		log.Println(string(msg.Value))
		session.MarkMessage(msg, "")
	}
	//什么情况下会到这里
	//msg被人关了,也就是要退出消费逻辑
	return nil
}

type MyBizMsg struct {
	Name string
}

sarama 使用入门:ConsumerGroupHandler

下面的代码就是对ConsumerGroupHandler的实现,关键就是在消费了msg之后,如果消费成功了,要记得提交。

也就是调用MarkMessage方法。

至于 Setup 和 Cleanup 方法反而用得不多。

type testConsumerGroupHandler struct {
}

func (t testConsumerGroupHandler) Setup(session sarama.ConsumerGroupSession) error {
	log.Println("Setup session:", session)
	return nil
}

func (t testConsumerGroupHandler) Cleanup(session sarama.ConsumerGroupSession) error {
	log.Println("Cleanup session:", session)
	return nil
}

func (t testConsumerGroupHandler) ConsumeClaim(
	//代表的是你和Kafka的会话(从建立连接到连接彻底断掉的那一段时间)
	session sarama.ConsumerGroupSession,
	claim sarama.ConsumerGroupClaim) error {
	msgs := claim.Messages()
	for msg := range msgs {
		//var bizMsg MyBizMsg
		//err := json.Unmarshal(msg.Value, &bizMsg)
		//if err != nil {
		//	//这就是消费消息出错
		//	//大多数时候就是重试
		//	//记录日志
		//	continue
		//}
		log.Println(string(msg.Value))
		session.MarkMessage(msg, "")
	}
	//什么情况下会到这里
	//msg被人关了,也就是要退出消费逻辑
	return nil
}

sarama 使用入门:利用context来控制消费者退出

可以利用初始化ConsumerGroup 时候传入的ctx来控制消费者组退出消息。

下图中,我传入了一个超时的context,那么:

	start := time.Now()
	//这里是测试,我们就控制消费10s
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	//开始消费,会在这里阻塞住
	err = consumerGroup.Consume(ctx, []string{"test_topic"}, testConsumerGroupHandler{})
	//你消费结束,就会到这里
	t.Log(err, time.Since(start).String())	

下图中,我主动调用了cancel,那么:

	start := time.Now()
	//这里是测试,我们就控制消费5s
	ctx, cancel := context.WithCancel(context.Background())
	time.AfterFunc(time.Second*5, func() {
		cancel()
	})
	//开始消费,会在这里阻塞住
	err = consumerGroup.Consume(ctx, []string{"test_topic"}, testConsumerGroupHandler{})
	//你消费结束,就会到这里
	t.Log(err, time.Since(start).String())
  • 如果超时了
  • 如果我主动调用了cancel

以上两种情况,任何一种情况出现了,都会让消费者退出消息。

sarama 使用入门:指定偏移量消费

在部分场景下,我们会希望消费历史消息,或者从某个消息开始消费,那么可以考虑在Setup里面设置偏移量。

关键调用是 ResetOffset。

不过一般建议走离线渠道,操作Kafka集群去重置对应的偏移量。

核心在于,你并不是每次重新部署,重新启动都是要重置这个偏移量的。

只要你的消费者组在这个分区上有过“已提交的 offset”,Kafka 就会优先使用这个提交的 offset,而忽略你在 Setup() 中设置的 offset。

// 在每次 rebalance 或初次连接 Kafka 后调用,用于初始化。
func (t testConsumerGroupHandler) Setup(session sarama.ConsumerGroupSession) error {
	//执行一些初始化的事情
	log.Println("Setup")
	//假设要重置到0
	var offset int64 = 0
	//遍历所有的分区
	partitions := session.Claims()["test_topic"]
	for _, p := range partitions {
		session.ResetOffset("test_topic", p, offset, "")
		//session.ResetOffset("test_topic", p, sarama.OffsetNewest, "")
		//session.ResetOffset("test_topic", p, sarama.OffsetOldest, "")
	}
	return nil
}

sarama使用入门:异步消费,批量提交

正常来说,为了在异步消费失败之后还能继续重试,可以考虑异步消费一批,提交一批。

下图中,ctx.Done分支用来控制凑够一批的超时机制,防止生产者的速率很低,一直凑不够一批。

func (t testConsumerGroupHandler) ConsumeClaim(
	//代表的是你和Kafka的会话(从建立连接到连接彻底断掉的那一段时间)
	//可以通过 session 控制 offset 提交,获取消费者信息,并感知退出时机。
	session sarama.ConsumerGroupSession,
	//claim 是你获取消息的入口
	claim sarama.ConsumerGroupClaim) error {
	msgs := claim.Messages()

	//设置批量处理的条数
	const batchSize = 10
	for {
		ctx, cancel := context.WithTimeout(context.Background(), time.Second*1)
		var eg errgroup.Group
		var last *sarama.ConsumerMessage
		for i := 0; i < batchSize; i++ {
			done := false
			select {
			case <-ctx.Done():
				//这边表示超时了
				done = true
			case msg, ok := <-msgs:
				if !ok {
					cancel()
					return nil
				}
				last = msg
				msg1 := msg
				eg.Go(func() error {
					//我就在这里消费
					time.Sleep(time.Second)
					//你在这里重试
					log.Println(string(msg1.Value))
					return nil
				})
			}
			if done {
				break
			}
		}
		cancel()
		err := eg.Wait()
		if err != nil {
			//这边能怎么办?
			//记录日志
			continue
		}
		//就这样
		session.MarkMessage(last, "")
	}
	return nil
}

另外一个分支就是读取消息,并且提交到errgroup里面执行。

Sleep是模拟长时间业务执行。

【Bluetooth|蓝牙开发】二、蓝牙开发入门 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。 阅读详情

相关推荐

Android定位权限全解析:从基础配置到后台持续定位的完整解决方案

本文全面解析Android定位权限体系,从基础配置到后台持续定位的完整解决方案。涵盖LocationManager和FusedLocationProviderClient等主流API的对比选型,详细讲解动态权限申请、精确定位与模糊定位的智能切换,以及Android 10+的后台定位适配策略。帮助开发者构建兼顾精准度与电量友好的定位方案,适用于导航、运动轨迹记录等多种场景。

weixin_29310605的博客 605

【亲测免费】 探索Sarama:IBM开源的Kafka Go客户端

探索Sarama:IBM开源的Kafka Go客户端 【免费下载链接】sarama Sarama is a Go library for Apache Kafka. 项目地址: https://gitcode.com/gh_mirrors/sar/sarama ...

gitblog_00002的博客 858

【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)

完整笔记:http://www.gwylab.com/note-vae.html 李宏毅老师的教程视频:https://www.bilibili.com/video/av15889450/?p=33 —————————————————————————————————   依据李宏毅老师的讲解,我整理了一番VAE的笔记。先简单介绍一下VAE,VAE作为一个生成模型,其基本思路是很容易理解的:把一堆真...

a312863063的博客 14万+

go之kafka库sarama的使用

saram是一个使用纯go语言编写的kafka库。

专注于Python编程技术的分享与交流,致力于帮助开发者提升编程技能,解决实际问题,探索Python的无限可能。 3148

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 452

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2452

Golang中如何正确的使用sarama包操作Kafka?

背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投递消息到Kafka后就给A返回发送成功。这个时候,其实还没有持久化到mysql中,虽然最终会保持一致性。所以,试想如果Kafka丢消息了,是不是就出大问题了?A认为给B发送消息成功了,但是在服务器内部消息丢失了B并没有收到。 所以,在使用Kafka的时候,有一些业务对消息丢失问题非常的关注。 同样,常见的问题还有: 重复消费的问题。 乱序的问题。 下面我们来一起看一下

xmcy001122的专栏 4185

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5189

go语言并发实战——日志收集系统(三) 利用sarama包连接KafKa实现消息的生产与消费

由于1.19版本后添加了ztcd压缩算法,需要用到cgo,这里我们为了方便考虑选择下载。不过这个不能实现直接的消费,后续我们会对这个进行补充,这里制作介绍。今天我们所时机的内容需要用到go语言的第三方包。了,但是博主在做的时候发现,这样会直接清除掉。命令来安装第三方包,我们要使用/,所以这里我们不能直接使用。其实这是已经可以使用命令。等待命令运行完毕,打开。这时候再打开终端输入。

qq_73924465的博客 2531

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 428

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 889

golang kafka客户端 sarama,segmentio/kafka-go ,confluent-kafka-go,franz-go比较

golang kafka客户端 sarama,segmentio/kafka-go ,confluent-kafka-go,franz-go哪个更好

王仁一的博客 2157

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

用go实现的kafka客户端,基于sarama和sarama-cluster

工作中需要将原先的消息队列替换成kafka,于是接触了基于go实现的sarama,又因为sarama不支持consumer group,于是又使用了sarama cluster,同时因为需要尽量保证消费一次的语义,就自己造了个简单的轮子,把sarama和sarama cluster封装到一起,同时实现了保证消费一次的语义,我给它起名为kago。 先附上kago的依赖,需要先进行安装: go...

jeffrey11223的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

推荐使用:Sarama - 高效的Go语言Kafka客户端库

推荐使用:Sarama - 高效的Go语言Kafka客户端库 saramaSarama is a Go library for Apache Kafka 0.8, and up.项目地址:https://gitcode.com/gh_mirrors/sa/sarama 项目介绍 Sarama是一款由Shopify公司开发并维护的开源项目,它是一个完全遵循MIT许可证的Go语言编写的Apache ...

gitblog_00080的博客 1236

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

golang客户端sarama通过SSL连接Kafka配置

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34032827的博客 2258

Sarama:Go语言Apache Kafka客户端库全面解析

Sarama:Go语言Apache Kafka客户端库全面解析 【免费下载链接】sarama 项目地址: https://gitcode.com/gh_mirrors/sara/sarama ...

gitblog_00753的博客 401

【GoCN酷Go推荐】Shopify 出品的完整度最完善的 Kafka 客户端_sarama

1. sarama 是什么?sarama 的出现意味着,golang 有完整的 apache kafka 客户端文档的全部用例了2. 为什么那么受欢迎?他完整,兼容性好不需要 CGO 的支...

Go中国 1365

如何快速掌握Sarama:Go语言Kafka客户端的终极指南

想要在Go语言项目中高效使用Apache Kafka吗?Sarama作为一款功能强大的Go语言Kafka客户端库,能够帮助你轻松构建可靠的消息处理系统。本指南将带你从零开始,快速掌握Sarama的核心功能和最佳实践。 ## 什么是Sarama?为什么选择它? Sarama是一个MIT许可的Go客户端库,专门为Apache Kafka设计。它提供了完整的Kafka协议支持,包括生产者、消费者、事

gitblog_00969的博客 1112

Go Kafka客户端终极对决:kafka-go vs sarama性能基准测试全解析

在Go语言的微服务生态中,Apache Kafka作为分布式消息系统的首选方案,其客户端库的性能表现直接影响着整个系统的吞吐量和响应速度。本文将深入对比两个主流的Go Kafka客户端库——kafka-go和sarama的性能表现,通过详细的基准测试数据,帮助你做出最合适的技术选型决策。 ## 测试环境与方法论 本次基准测试在标准化的环境中进行,确保结果的公正性和可重复性。测试环境配置如下:

gitblog_00417的博客 886

【亲测免费】 Sarama:面向Apache Kafka的Go语言客户端库

Sarama:面向Apache Kafka的Go语言客户端库 【免费下载链接】sarama 项目地址: https://gitcode.com/gh_mirrors/sara/sarama ...

gitblog_01142的博客 759

深度解析Sarama:构建高性能Go语言Kafka客户端的完整指南

Sarama是一个MIT许可的Go客户端库,专为Apache Kafka设计,提供可靠、高效的消息传递能力。作为Go语言生态中最受欢迎的Kafka客户端之一,Sarama支持从Kafka 0.8.2.0到最新版本的协议,为开发者提供了构建高并发、低延迟消息系统的强大工具。 ## 为什么选择Sarama? ### ✅ 核心优势 - **全面的协议支持**:兼容Kafka 0.8.2.0至最新版本

gitblog_00963的博客 918

Sarama:写稳写快的 Go Kafka 客户端

当 Go 服务要在高并发下稳定地收发 Kafka 消息,Sarama 这个 Go Kafka 客户端把批量、重试、再平衡和协议版本这些脏活都消化掉了,你只管写业务。 ## 整体架构鸟瞰 仓库文件看似平铺,分层其实很清晰:[client.go](https://link.gitcode.com/i/2633aca14f646ae90016d8bfa0ceaf6b) 缓存集群元数据,[broker

gitblog_00687的博客 872

Sarama架构深度解析:一文看懂 Go Kafka 客户端的四层架构

本文把 Sarama 的架构一次讲透:Sarama 是 Apache Kafka 的 Go 客户端库,把协议编解码、元数据管理、生产消费和事务都封装在这一个包里。按"接入 → 协议 → 处理 → 观测"四层解剖,10 分钟你就能在脑子里画出完整骨架。适合刚上手的新手和需要做深度定制的开发者。 ## 它凭什么值得用 自己写一个能用的 Kafka 客户端,要处理几十种线上协议、多版本兼容、分区再平

gitblog_00929的博客 992

Sarama:Go语言Kafka客户端完整指南

想象一下,当你需要在Go应用中集成Kafka消息队列时,面对复杂的协议细节和性能优化挑战,是否曾感到无从下手?Sarama正是为解决这一痛点而生,它为Go开发者提供了一个功能完整、性能卓越的Kafka客户端解决方案。 ## 为什么选择Sarama?核心价值矩阵 | 特性维度 | Sarama优势 | 传统解决方案痛点 | |---------|-----------|-------------

gitblog_00686的博客 941

探索高效数据流处理:Sarama——为Apache Kafka量身打造的Go语言客户端库

探索高效数据流处理:Sarama——为Apache Kafka量身打造的Go语言客户端库 【免费下载链接】sarama Sarama is a Go library for Apache Kafka. 项目地址: https://...

gitblog_00931的博客 1041
上一篇: Kafka的基本概念和Dokcer中部署Kafka
下一篇: Go语言Map的底层原理
Cxzzzzzzzzzz
博客等级 码龄4年 229粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值