Go sarama 元数据刷新参数怎么设置?
1. Go sarama 客户端元数据更新参数由 Metadata.Full 控制,设计实现上考虑方便默认为 true,会更新全量 Topic 的元数据,对性能有一定影响,对于大量 topic 的情况下,可能影响客户使用 kafka 生产和消费的性能,建议客户修改该配置为 false。
2. Go sarama 客户端默认的元数据刷新时间参数由 Metadata.RefreshFrequency 控制,默认值为10分钟,容易触及 Broker 默认的连接空闲超时(10min)导致连接被中断,建议调整成5分钟与 kafka java 标准 sdk 默认参数保持一致。
Go sarama Offset 提交过期时间怎么设置?
Go sarama 客户端 CommitOffset 请求可以指定 offset 的过期时间,该参数由 Retention.Minutes 控制,默认值为0,该值会导致提交后位点会立马过期,建议设置该值与 CKafka 位点过期时间保持一致,建议为7天。
使用 Go sarama cluster 客户端无法生产或者消费怎么办?
目前 sarama cluster 已经不再维护,存在诸多缺陷,目前存在如下已知缺陷:消费者客户端底层代码 PartitionConsumer 会调用 FetchRequest 解包 FetchResponse,此时 sarama cluster 实现没有按照标准协议实现,存在缺陷,即使服务端实际返回全量的元数据,但是客户端有概率出现解析到的元数据不全的问题,从而出现无法生产或者消费,报错特征为:
response did not contain all the expected topic/partition blocks
。
具体场景举例:
在客户实例进行升降配操作,因为会增加节点,此时会触发客户端进行元数据更新,如果在元数据中,按照 test-0,a-0,test-1,a-1,test-2 的顺序返回 test 的3个分区,a 的2个分区的全量元数据,虽然 broker 会返回全量的元数据,但是存在一定概率出现顺序有间隔,sarama cluster 的客户端解析时候会出现解析到不完整的元数据,比如只能解析到 a-1,test-2两个元数据,引发如上报错问题,即响应没有包含预期所有分区元数据,从而导致无法生产或者消费。
针对该情况,标准协议实现的客户端是不会出现的,例如 Java,confluent go,因此建议客户在升降配前,务必了解是否使用该客户端,因为升降配会导致元数据更新的场景十分频繁,如果有,则强烈建议客户升级为 confluent go 客户端再进行升降配,如果无法升级,在出现该问题后立刻进行客户端重启,则有概率恢复正常。