[英]Guidelines to handle Timeout exception for Kafka Producer?
由于我的 Kafka 制作人的各种原因,我经常收到超时异常。 我目前正在使用生产者配置的所有默认值。
我见过以下超时异常:
org.apache.kafka.common.errors.TimeoutException:60000 毫秒后无法更新元数据。
org.apache.kafka.common.errors.TimeoutException:主题 1-0 的 1 条记录到期:自上次追加以来已过去 30001 毫秒
我有以下问题:
这些超时异常的一般原因是什么?
处理超时异常的一般准则是什么?
超时异常是可重试的异常吗?重试它们是否安全?
我正在使用 Kafka v2.1.0 和 Java 11。
提前致谢。
“这些超时异常的一般原因是什么?”
我之前看到的最常见的原因是由于元数据信息过时:一个代理出现故障,并且该代理上的主题分区故障转移到其他代理。 但是,主题元数据信息尚未正确更新,客户端仍会尝试与失败的代理通信以获取元数据信息或发布消息。 这会导致超时异常。
网络连接问题。 这可以通过telnet broker_host borker_port
轻松诊断
经纪人超载。 如果代理因高工作负载而饱和,或者托管太多主题分区,就会发生这种情况。
处理超时异常,一般的做法是:
排除经纪人方面的问题。 确保主题分区完全复制,并且代理没有过载
修复主机名解析或网络连接问题(如果有)
调整request.timeout.ms
、 delivery.timeout.ms
等参数。我过去的经验是默认值在大多数情况下都能正常工作。
生产者和代理的默认 Kafka 配置值足够保守,在一般情况下,您不应该遇到任何超时。 这些问题通常指向生产者和经纪人之间的脆弱/有损网络。
你得到的例外, Failed to update metadata
,通常意味着生产者无法访问其中一个经纪人,结果是它无法获得元数据。
对于您的第二个问题,Kafka 将自动重试发送代理未完全确认的消息。 如果您想在应用程序端超时时捕获并重试,这取决于您,但如果您达到 1 分钟以上的超时,重试可能不会产生太大影响。 无论如何,您将不得不弄清楚代理的底层网络/可达性问题。
根据我的经验,通常网络问题是:
nc -z broker-ip 9092
)我建议在构建 Producer config 时使用以下属性
卡夫卡.acks=1
kafka.retries=3
超时.ms=200
retry.backoff.ms=50
dataLogger.kafka.delivery.timeout.ms=1200
producer.send(record, new Callback {
override def onCompletion(recordMetadata: RecordMetadata, e: Exception): Unit = {
if (e != null) {
logger.debug(s"KafkaLogger : Message Sent $record to Topic ${recordMetadata.topic()}, Partition ${recordMetadata.partition()} , Offset ${recordMetadata.offset()} ")
} else {
logger.error(s"Exception while sending message $item to Error topic :$e")
}
}
})
producer.close(1000, TimeUnit.MILLISECONDS)
如果生产者或消费者无法访问“advertised.listeners”(protocol://host:port)的值,则会发生超时异常
通过以下命令检查属性“advertised.listeners”的配置:
cat $KAFKA_HOME/config/server.properties
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.