生产环境必须用异步生产者+正确配置:requiredacks设为waitforall、timeout≥10s、用byteencoder、topic通过newclusteradmin创建、version匹配服务端、避免复用adminclient;消费者优先选newconsumergroup。

同步生产者默认不保证消息落盘,生产环境必须用异步生产者 + 正确配置组合,否则“发送成功”只是假象。
为什么 SendMessage 返回成功但消息丢了
常见错误现象:partition:0 offset:123 日志打印了,但集群重启后查不到;或 leader 切换后消费端跳过该 offset。
-
config.Producer.RequiredAcks默认是sarama.NoResponse:broker 收到请求就回包,不等写磁盘、也不等副本同步 - 必须设为
sarama.WaitForAll:强制等待所有 ISR 副本写入成功,这是生产环境底线 -
config.Producer.Timeout至少设为10 * time.Second:Kafka broker 默认request.timeout.ms=30000,客户端超时若更短(如默认 3s),会提前报context deadline exceeded,但 broker 可能仍在后台重试 - 别用
sarama.StringEncoder传二进制数据:遇到\x00会截断,一律改用sarama.ByteEncoder([]byte{...})
Topic 创建必须走 NewClusterAdmin
本地用 kafka-topics.sh 创建的 topic,在多节点集群中常出现分区不均、ISR 数不足、甚至 UNKNOWN_TOPIC_OR_PARTITION 错误。
-
NewClusterAdmin能实时拉取元数据,创建时校验ReplicationFactor是否 ≤ 当前可用 broker 数(设 3 却只启 2 个 broker 会卡住) - 自动处理权限/配额类错误,比如
TOPIC_AUTHORIZATION_FAILED,而命令行工具只报模糊异常 -
config.Version必须匹配 Kafka 服务端版本,例如 Kafka 2.8+ 对应sarama.V2_8_0_0;低版本 client 设高 version 会直接失败 - 别复用
AdminClient实例做高频建 Topic 操作:长期运行需手动调RefreshMetadata(),否则元数据过期导致创建失败
消费者该用 NewConsumerGroup 还是 NewConsumer
绝大多数生产场景该用 sarama.NewConsumerGroup,不是 sarama.NewConsumer。
-
NewConsumerGroup支持自动分区再均衡、偏移量自动提交(可选)、多实例水平扩展;NewConsumer是单消费者单分区硬绑定,连 offset 都要自己手写,只适合调试 -
config.Group.ID绝不能为空字符串:空值会导致 consumer 拒绝加入 group,日志只报group coordinator not available,极难排查 -
ConsumerGroupHandler.ConsumeClaim中,claim.Messages()返回阻塞 channel,必须用for { select { case msg := 包裹,否则 <code>Close()不生效 - 不要在
Messages()外层加range:它底层是无限 for-loop + channel recv,range会卡死
AsyncProducer 才是生产环境标配
SyncProducer 阻塞调用、吞吐低,只适合调试或极低频场景(比如每分钟几条告警)。
- 生产环境必须用
AsyncProducer:把消息扔进内部 channel 后立刻返回,后台批量发、重试、背压控制都由库自己做 -
AsyncProducer必须监听Successes和Errorschannel 才能感知结果,漏监听等于“发了当没发” -
config.ChannelBufferSize建议设为 256 或 512:太小会阻塞业务 goroutine,太大则内存占用高 - 务必
defer producer.AsyncClose():AsyncProducer的关闭是异步的,Close()不生效,必须用AsyncClose()并等待其完成
真正容易被忽略的是:AsyncProducer 的 AsyncClose() 必须显式等待完成,否则进程退出时未 flush 的消息会静默丢失;还有就是 Group.ID 看似简单,但空字符串、非法字符或超长都会让整个消费者组失效,且错误日志极其隐蔽。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











