腾讯云消息队列 CKafka - Sarama 客户端异常
文档简介:
问题概述:
Sarama 是一个 Golang 编写的 Kafka 客户端,具有较高的消息吞吐性能。
当因为性能达到瓶颈,主动扩容 CKafka 分区后,Sarama 客户端可能会无法感知分区的 reBalance,导致新分区的信息无法被正常生产消费。
问题概述
Sarama 是一个 Golang 编写的 Kafka 客户端,具有较高的消息吞吐性能。
当因为性能达到瓶颈,主动扩容 CKafka 分区后,Sarama 客户端可能会无法感知分区的 reBalance,导致新分区的信息无法被正常生产消费。
可能原因
CKafka 由于各种原因对分区进行 reBalance 后,Sarama 需要大约 10 分钟时间间隔感知分区变动,并拉取当前 topic 的 metadata,解析最新的分区数据。由于拉取时间较久,有时会被用户视作拉取失败。
除此之外,在 CKafka 团队长期维护使用中,也发现偶尔会出现 Sarama 客户端拉取最新分区信息失败,导致消息堆积并随机抛出异常的现象。
该场景已经在 Sarama 社区多次提出并且加以关注修复,在迄今为止的最新版本错误出现频率降低,但问题依旧存在。
解决方法
如果用户对 reBalance 现象敏感,并且使用 Golang 技术栈,建议尽快迁移使用 Confluent™ 维护的客户端 Confluent-Kafka-go。
常用 Golang 客户端对比
Golang 客户端
|
优点
|
局限性
|
Sarama
|
社区活跃度高。Sarama 项目使用者较多,在社区提出问题得到解答与修复的时间较快。
性能较高。Sarama 采用原生 Golang 语言编写,对于异步以及高并发操作支持度较好。
|
稳定性一般。Sarama 在扩容分区并 reBalance 后可能会有未知错误。
|
Confluent-Kafka-go(推荐)
|
非常稳定。由于客户端实际上是对于 librdkafka C++ 库的一层封装, 而 librdkafka 库已经在多种语言上运行多年,能够提供足够的可靠性。
性能较高。由于底层使用 C++ 具体实现,所需资源较少,运算速度快。
|
增加编译复杂度。由于导入 C++ 库,Golang 编译器需要引入额外编译配置,增加了编译依赖,提高编译复杂度。
除此之外,由于不同编译环境 C++ 库实现逻辑不同,引入 librdkafka 库可能会对 Golang 项目交叉编译造成影响。
|
kafka-go
|
接口完善。kafka-go 不仅提供顶层接口,同时也暴露底层接口。用户可以更为灵活的调用配置 kafka 客户端。
操作简单。kafka-go 在进行基础的生产消费所需代码较少,具有较多的缺省配置。
|
与前两款客户端相比性能较差,可能无法满足大规模并发需求。
|