Skip to main content

客户端 SDK 开发指南

AutoMQ 完全兼容 Apache Kafka,支持使用 Apache Kafka 的客户端 SDK 进行集成和收发消息。本文档介绍 AutoMQ 推荐的客户端 SDK 以及使用注意事项。

兼容性说明

AutoMQ 完全兼容 Apache Kafka (0.10 ~ 3.9 版本),推荐使用 Apache kafka 的客户端 SDK 访问 AutoMQ 进行收发消息。根据 Apache Kafka 的协议协商原则,在上述范围内的客户端版本均可以正常接入。

建议应用侧尽可能升级到更新的 SDK 版本,以修复历史版本的隐藏缺陷。

推荐的客户端 SDK 列表

Apache Kafka 社区针对不同的开发语言提供了多种 SDK 选择,用户可查看社区的文档信息。AutoMQ 技术团队基于大量的生产实践,针对不同的开发语言推荐客户使用如下 SDK 接入 AutoMQ。

开发语言
客户端 SDK
推荐版本
Java
Apache Kafka Java Client
>= 3.2.0
C/C++
librdkafka
>= 2.8.0
Go
franz-go
>= 1.17.1
Python
kafka-python-ng
>= 2.2.3
NodeJS
KafkaJS
>= 2.2.4

如果目前使用的 SDK 不在上述推荐列表范围内,只要兼容 Apache Kafka 协议,则仍然可以继续访问 AutoMQ,建议查看下方的已知问题列表,进行适当的参数调整。

客户端参数调优

使用 Apache Kafka SDK 收发消息时,除了选择推荐的 SDK 版本,还需要针对 Producer、Consumer 的关键参数进行调整,以达到最佳的性能。

建议参考Kafka 客户端配置调优▸ 进行参数检查和调整。

附录:其他已知问题

Sarama Go SDK

已知缺陷
缺陷信息
修复方法
Async Producer 在发送重试时没有限制内存占用
  • 缺陷版本:V1.43.3
  • 社区 Issue:https://github.com/IBM/sarama/issues/1358
  • 社区 PR:https://github.com/IBM/sarama/pull/3026
  • 现象:在使用 async_producer 发送消息,且对应 Topic 发生分区迁移时,Producer 内存占用会异常升高,甚至导致 OOM。
  • 原因:当 async_producer 接收到服务端的可重试错误(如分区迁移导致的 NOT_LEADER_OR_FOLLOWER)时,会将消息暂存于内存中,并根据策略进行重试。然而,该重试缓存没有大小限制,若大量且持续的重试发生,内存使用可能意外增加。
  • 升级版本到 >= V1.44.0

Kafka-Go SDK

已知缺陷
缺陷信息
修复方法
Consumer 无法识别 Group Coordinator 变更
  • 缺陷版本:V0.4.47
  • 现象:__consumer_offsets Topic 发生分区迁移后,部分 Group 消费中断,日志报错
  • 原因:当 __consumer_offsets 分区迁移后,会导致部分 Group 的 Coordinator 发生变更。而 kafka-go 没有正确地处理该情况——在 Coordinator 变更后,仍然向老的 Coordinator 发送请求,导致了 NOT_COORDINATOR 报错。
  • 临时重启 Consumer 恢复。
  • 更换 SDK ,推荐使用 Franz-Go SDK,参考本文档推荐版本。

Kafka JS SDK

已知缺陷
缺陷信息
修复方法
Consumer 配置 heartbeatInterval 不准确
  • 缺陷版本:V2.2.4
  • 社区说明:https://github.com/tulios/kafkajs/issues/130#issuecomment-422024849
  • 现象:当 Consumer 配置的 heartbeatIntervalsessionTimeout 过于接近时,Consumer 会周期性 Leave & Rejoin Group(但基本不影响消费),日志报错。
  • 原因:kafkajs 中的配置 heartbeatInterval 仅保证了“两次心跳间的最小间隔时间”,即在某些场景下(例如,Consumer 消费到 Topic 末尾,没有新的消息可供消费),Consumer 向 Coordinator 发送心跳的间隔可能超过 heartbeatInterval ;而如果该值配置地过大,就可能超过 sessionTimeout 进而导致 Coordinator 将 Consumer 驱逐。
  • 调低 heartbeatInterval 或调高 sessionTimeout (建议heartbeat.interval.ms 不应超过 session.timeout.ms 的 1/3)。