开源笔记|franz-go:Go 项目连接 Kafka,为什么越来越多人不再首选 Sarama?

ssnoodles 开源星球笔记
2026年08月06日 13:09

1. Kafka 客户端,为什么值得重新选择?

在 Go 生态里,Kafka 客户端长期以来绕不开两个名字:

  • Sarama
  • franz-go

很多早期 Go 项目连接 Kafka,第一选择几乎都是 Sarama。

原因很简单:

  • 使用时间长
  • 社区资料多
  • API 相对成熟
  • 大量生产项目验证

但是随着 Kafka 版本不断演进,Go 开发者开始发现:

Kafka 客户端不仅仅是"能发送消息"这么简单。

现代 Kafka 生产环境越来越关注:

  • Kafka 新协议支持
  • 性能
  • 消费组管理
  • Exactly Once 语义
  • 维护活跃度
  • API 设计体验

这也是 franz-go 开始受到关注的原因。


2. Sarama 曾经为什么流行?

Sarama 是 Go 生态最早成熟的 Kafka 客户端之一。

它最大的优势:

2.1 成熟稳定

Sarama 出现时间较早,大量企业项目使用。

很多系统:

  • 日志采集
  • 数据同步
  • 消息队列
  • IoT 数据流

都有 Sarama 的身影。

2.2 使用简单

例如生产消息:

producer, _ := sarama.NewSyncProducer(    []string{”localhost:9092”},    nil,) msg := &sarama.ProducerMessage{    Topic: ”test”,    Value: sarama.StringEncoder(”hello kafka”),} producer.SendMessage(msg)

对于普通业务:

能发送,能消费,就够用了。


3. 为什么 Sarama 开始暴露问题?

Kafka 本身一直在发展。

但是客户端需要跟进 Kafka 协议变化。

这方面 Sarama 出现了一些不足。


3.1 Kafka 新特性支持滞后

Kafka 后续增加:

  • KRaft 模式
  • 新版本协议
  • Consumer Group 新机制
  • 新管理 API

客户端需要持续维护。

而 Sarama 的设计年代比较早:

很多 API 是围绕旧 Kafka 设计的。


3.2 API 设计偏传统

Sarama 的 API 使用方式:

consumer, err := sarama.NewConsumer(    brokers,    config,)

然后:

partitionConsumer, _ :=    consumer.ConsumePartition(        topic,        partition,        offset,    )

这种方式接近 Kafka 底层模型。

开发者需要理解:

  • partition
  • offset
  • consumer group
  • rebalance

对于简单项目没问题。

但是大型微服务:

维护成本会上升。


3.3 性能优化空间有限

Kafka 是高吞吐系统。

客户端性能主要来自:

  • 批量发送
  • 网络复用
  • 请求合并
  • 内存管理

franz-go 在这些方面重新设计。


4. franz-go 是什么?

franz-go 是一个现代 Go Kafka 客户端。

项目地址:

https://github.com/twmb/franz-go

它的目标:

提供完整 Kafka 协议支持,并保持高性能和现代 Go 风格。

核心组件:

franz-go ├── franz-go├── kgo│   Kafka Client├── franz-go/plugin└── franz-go/pkg

其中:

kgo.Client

是主要客户端。


5. franz-go 最大优势是什么?

5.1 Kafka 协议支持更完整

franz-go 直接实现 Kafka 协议。

支持:

  • Producer
  • Consumer
  • Admin
  • Transactions
  • Consumer Group

对于 Kafka 新版本:

兼容性通常更好。


5.2 更符合现代 Go 编程方式

创建客户端:

cl, err := kgo.NewClient(    kgo.SeedBrokers(        ”localhost:9092”,    ),)

发送消息:

cl.Produce(    context.Background(),    &kgo.Record{        Topic: ”orders”,        Value: []byte(”hello”),    },)

代码更加简洁。


5.3 高吞吐设计

Kafka 最重要的是吞吐。

franz-go 默认支持:

  • 自动 batching
  • 请求合并
  • 高效网络 IO

适合:

  • 日志系统
  • IoT 数据采集
  • 数据管道
  • 实时计算

6. franz-go 和 Sarama 对比

项目                 Sarama        franz-go


出现时间               较早         较新

Kafka 新版本支持   一般         更积极

API 风格               传统         Go 风格

性能                     良好         更优秀

Consumer Group     支持        支持更完整

Transaction            支持有限   更完善

学习成本                 较低         中等

新项目推荐               一般        推荐


7. Go 微服务为什么更倾向 franz-go?

现代 Go 后端越来越多采用:

HTTP API    |Gateway    |Micro Service    |Kafka    |Data Platform

Kafka 不只是消息队列。

它承担:

  • 服务解耦
  • 数据流转
  • 异步处理
  • 日志分析

所以 Kafka Client 需要:

  • 稳定
  • 高吞吐
  • 长期维护

franz-go 更符合这个方向。


8. 一个简单消费者示例

cl, err := kgo.NewClient(    kgo.SeedBrokers(        ”localhost:9092”,    ),) defer cl.Close() cl.AddConsumeTopics(    ”orders”,) for {    fetches := cl.PollFetches(        context.Background(),    )     fetches.EachRecord(        func(record *kgo.Record) {            fmt.Println(                string(record.Value),            )        },    )}

相比 Sarama:

代码更加接近现代 Go 风格。


9. 什么时候仍然选择 Sarama?

不是所有项目都需要 franz-go。

Sarama 依然适合:

老项目

已有大量:

  • Sarama 封装
  • 监控
  • 运维经验

迁移成本可能大于收益。


简单业务

例如:

每天几十万消息:

订单通知日志同步后台任务

Sarama 完全够用。


10. 新项目如何选择?

如果是新的 Go 项目:

推荐:

Kafka  |  |franz-go

尤其:

  • 微服务
  • IoT 平台
  • 数据采集
  • 实时计算

如果维护旧系统:

已有 Sarama      |      |继续使用

不要为了追新而迁移。


总结

Sarama 并没有过时。

它依然是 Go Kafka 生态的重要组件。

但是 Kafka 已经进入新的阶段:

  • 更高吞吐
  • 更多协议能力
  • 更复杂的数据流场景

franz-go 的出现代表了 Go Kafka 客户端的新方向。

对于新的 Go 微服务项目:

如果没有历史包袱,franz-go 已经成为比 Sarama 更值得优先考虑的选择。