选型上,kafka-go适合简单场景,sarama适合需严格语义的生产环境;配置上须关注requiredacks、close()调用、offset提交策略及advertised.listeners设置。

Go 用 Kafka 不难,但默认配置下容易丢消息、连不上、或消费卡死——关键在客户端选型、配置项取值和资源释放时机。
选 sarama 还是 kafka-go?看场景别硬套流行度
当前 GitHub 上 star 最多的是 segmentio/kafka-go,但它默认不支持消费者组(ConsumerGroup)的自动重平衡逻辑,需手动处理 offset 提交和分区分配;而 Shopify/sarama 虽稍重,但 ConsumerGroup 实现完整,适合需要严格语义(如 at-least-once)的生产环境。
- 快速验证或单分区简单场景:用
kafka-go,API 更简洁,WriteMessages一行发消息,ReadMessage一行收 - 要对接已有 Kafka 集群、需精确控制重试/压缩/SSL/SASL、或必须用消费者组:选
sarama,尤其注意它不自动关闭底层连接,Close()必须显式调用 - 别在
init()里全局初始化生产者——它不是线程安全的,高并发下会 panic;应封装成带池或单例的结构体
sarama.NewSyncProducer 的坑:成功返回 ≠ 消息已落盘
NewSyncProducer 听起来“可靠”,但实际是否真能保证不丢,完全取决于 RequiredAcks 和 broker 配置。默认是 sarama.NoResponse,即发完就返回,broker 甚至没来得及写入页缓存。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 设为
sarama.WaitForAll:要求 leader + 所有 ISR 副本都写成功,但若副本数replication-factor= 1,它退化为等 leader 写完,仍可能丢 -
config.Producer.Return.Successes = true必须开,否则SendMessage成功后你根本不知道发到哪个 partition 和 offset - 别忽略
producer.Close():不关会导致 goroutine 泄露和 TCP 连接堆积,Kafka broker 端日志会出现Connection reset类错误
kafka-go 消费者常见卡顿原因:offset 提交太勤或太懒
用 kafka-go 时,consumer.ReadMessage 默认是阻塞读,但卡住往往不是 Kafka 问题,而是应用层没管好 offset。
- 每条消息都立刻
CommitMessages:吞吐暴跌,网络 RTT 成瓶颈;且若提交后 crash,消息可能被重复消费 - 完全不提交、靠自动 commit(
AutoCommit: true):一旦 consumer 重启,会从上次自动保存位置开始,可能跳过未处理完的消息 - 推荐做法:批量处理 N 条后手动
CommitMessages,N 取 10–100,同时用context.WithTimeout包裹ReadMessage,防无限阻塞
本地调试连不上 localhost:9092?检查 broker 的 advertised.listeners
Kafka broker 默认只监听 localhost,但 Docker 或远程 client 会拿到 advertised.listeners 里的地址去连——如果它还是 localhost,就会连错。
- 本地开发:把 server.properties 里
advertised.listeners=PLAINTEXT://127.0.0.1:9092,并确保listeners=PLAINTEXT://:9092 - Docker 场景:必须映射端口 + 显式设
advertised.listeners=PLAINTEXT://host.docker.internal:9092(Mac/Win),Linux 则用宿主机 IP - Go 代码里 broker 地址写
[]string{"127.0.0.1:9092"},别写"localhost"——某些 DNS 解析慢的环境会导致超时
最易被忽略的点:Kafka 的 topic 必须提前创建,sarama 和 kafka-go 都不会自动建;auto.create.topics.enable=true 是 broker 侧开关,但生产环境通常关闭,靠运维统一管理 topic 生命周期。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










