使用云消息队列 Kafka 版时客户端的报错及解决方案

在使用云消息队列 Kafka 版时,客户端可能报错,您可以根据报错消息匹配对应的解决方案。

详细信息

报错信息对应的详细信息如下。

报错信息

客户端语言类型

报错原因

解决方案

TimeoutException

Java

  • 网络问题

  • 客户端鉴权(sasl.mechanisms)失败

说明

该报错仅出现在云消息队列 Kafka 版的公网实例中。

run out of brokers

Go

Authentication failed for user

Python

Leader is not available

所有

Topic初始化时会短暂报该错误。如果持续报错,可能是因为没有创建Topic。

  1. 登录云消息队列 Kafka 版控制台

  2. 检查Topic是否已经创建。

  3. 如果未创建,请先创建Topic。具体信息,请参见步骤一:创建Topic

leader is in election

array index out of bound exception

Java

Spring Cloud会按自己的格式解析消息内容。

参考如下两种解决方法:

  • 推荐同时使用Spring Cloud发送和消费。

  • 如果您使用其他方式发送,例如,调用原生Java客户端发送,通过Spring Cloud消费时,需要设置headerModeraw,即禁用解析消息内容。具体信息,请参见Spring Cloud官网

No such configuration property: "sasl.mechanisms"

  • C++

  • 包装C++的客户端,例如,PHP、Node.js等。

SASL和SSL模块未安装或安装异常。

参考如下命令安装SASL和SSL模块:

说明

此处以CentOS系统为例,其他系统请查阅相关官网或者第三方搜索引擎。

  • 安装SSL:sudo yum install openssl openssl-devel

  • 安装SASL:sudo yum install cyrus-sasl{,-plain}

No worthy mechs found

No KafkaClient Entry

Java

未找到kafka_client_jaas.conf配置文件。

准备好kafka_client_jaas.conf文件,放在任意目录下,这里假设为/home/admin。Java的安全登录设置是系统性的,有如下两种设置方法:

  • 设置系统变量:

    • 通过设置JVM参数:-Djava.security.auth.login.config=/home/admin/kafka_client_jaas.conf

    • 通过代码设置:System.setProperty("java.security.auth.login.config","/home/admin/kafka_client_jaas.conf")

      说明

      如果在代码中设置,请确保启动客户端之前代码能够被执行。

  • 配置系统文件:在${JAVA_HOME}/jre/lib/java.security中增加内容:login.config.url.1=file:/home/admin/kafka_client_jaas.conf

更多信息,请参见Oracle JAAS Login Configuration File

Error sending fetch request

Java

Consumer拉取消息失败报错,可能的原因如下:

  • 网络问题

  • 拉取消息超时

  1. 确保servers配置正确。

  2. 通过telnet命令排除网络问题。

  3. 如果网络正常,可能是拉取消息超时引起。可以尝试调整下列两个参数,限制单次拉取的消息量。

    • fetch.max.bytes:单次拉取操作,服务端返回的最大Bytes。

    • max.partition.fetch.bytes::单次拉取操作,服务端单个Partition返回的最大Bytes。

  4. 服务端流量限制,可以在云消息队列 Kafka 版控制台实例详情页面查看相应内容。

    • VPC访问时查看峰值流量。

    • 公网访问时查看公网流量。

DisconnectException

CORRUPT_MESSAGE

所有

  • 如果是云存储引擎:客户端版本大于等于3.0时,自动开启幂等功能, 但云存储不支持幂等功能

  • 如果是Local存储引擎:发送compact消息, 但未传递key值。

  • 如果是云储存引擎:在客户端设置enable.idempotence=false

  • 如果是Local存储引擎:消息添加key值。