由于卡夫卡制作人中的各种原因,我经常会遇到超时异常。我目前正在使用生产者配置的所有默认值。
我已经看到以下超时异常:
org.apache.kafka.common.errors.TimeoutException:无法更新60000毫秒后的元数据。
org.apache.kafka.common.errors.TimeoutException:即将到期1条记录对于主题-1-0:自上次追加以来已经过去了30001毫秒
我有以下问题:
这些超时异常的一般原因是什么?
处理超时异常的一般准则是什么?
超时异常是可重试的异常,重试它们是否安全吗?
我正在使用Kafka v2.1.0和Java 11。
提前感谢。
生产者和经纪人的默认Kafka配置值都足够保守,在一般情况下,您不应该遇到任何超时。这些问题通常表明生产者和经纪人之间的网络不稳定/有损。
您得到的异常,Failed to update metadata
,通常意味着生产者无法访问其中一个中间人,结果是它无法获取元数据。
关于第二个问题,Kafka将自动重试以发送未完全由经纪人确认的消息。如果要在应用程序端超时时捕获并重试,则取决于您,但是如果您遇到1分钟以上的超时,重试可能不会有太大的不同。无论如何,您都必须找出与代理有关的潜在网络/可达性问题。
以我的经验,通常网络问题是:
nc -z broker-ip 9092
)“这些超时异常的一般原因是什么?”
我之前看到的最常见原因是由于陈旧的元数据信息:一个代理崩溃了,该代理上的主题分区已故障转移到其他代理。但是,主题元数据信息尚未正确更新,并且客户端仍尝试与失败的代理进行对话以获取元数据信息或发布消息。这导致超时异常。
Netwowrk连接问题。可以通过telnet broker_host borker_port
代理过载。如果代理充满了高工作负载,或者托管了太多主题分区,则可能会发生这种情况。
要处理超时异常,一般做法是:
解决经纪人方面的问题。确保主题分区已完全复制,并且代理未过载
修复主机名解析或网络连接问题,如果有的话
Tune参数,例如request.timeout.ms
,delivery.timeout.ms
等。我过去的经验是,默认值在大多数情况下都可以正常工作。
如果生产者无法获得“ advertised.listeners”(protocol:// host:port)的值,则会发生超时异常
通过以下命令检查属性“ advertised.listeners”的配置:
cat $KAFKA_HOME/config/server.properties