使用 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 客户端再进行升降配,如果无法升级,在出现该问题后立刻进行客户端重启,则有概率恢复正常。