由于Kafka制作人的各种原因,我经常遇到超时异常。我目前正在使用producer config的所有默认值。
我看到了以下超时异常:
org.apache.kafka.common.errors.timeoutexception:在60000毫秒后更新元数据失败。
org.apache.kafka.common.errors.timeoutexception:自上次追加后,主题1-0的1条记录已过期:30001毫秒
我有以下问题:
这些超时异常的一般原因是什么?
临时网络问题
服务器问题?如果是,那么什么样的服务器问题?
处理超时异常的一般准则是什么?
设置“retries”配置以便kafka api执行重试?
增加“request.timeout.ms”或“max.block.ms”?
捕获异常并让应用程序层重试发送消息,但异步发送似乎很困难,因为消息将按顺序发送?
超时异常是否可重试异常,重试是否安全?
我使用的是kafka v2.1.0和java11。
提前谢谢。
4条答案
按热度按时间41zrol4v1#
“这些超时异常的一般原因是什么?”
我之前看到的最常见的原因是过时的元数据信息:一个代理宕机,该代理上的主题分区故障转移到其他代理。但是,主题元数据信息尚未正确更新,客户端仍尝试与失败的代理对话以获取元数据信息或发布消息。导致超时异常。
网络连接问题。这很容易被诊断为
telnet broker_host borker_port
经纪人超载了。如果代理的工作负载很高,或者承载了太多的主题分区,则可能会发生这种情况。要处理超时异常,一般做法是:
排除经纪人方面的问题。确保主题分区被完全复制,并且代理没有过载
修复主机名解析或网络连接问题(如果有)
调整参数,例如
request.timeout.ms
,delivery.timeout.ms
我过去的经验是,默认值在大多数情况下都可以正常工作。toe950272#
我建议在构造producer配置时使用以下属性
需要分区负责人的确认
kafka.acks=1
Kafka制作人发送消息和接收领队确认的最大重试次数
kafka.retries=3个
每个单独请求的请求超时
超时ms=200
等待再次发送下一个请求;这是为了避免在紧密循环中发送请求;
retry.backoff.ms=50
完成所有重试的上限
datalogger.kafka.delivery.timeout.ms=1200
关闭生产者超时
生产者。关闭(1000,时间单位。毫秒)
p8h8hvxi3#
如果“advised.listeners”的值(protocol://host:端口)生产者或消费者无法访问
通过以下命令检查属性“Adverted.listeners”的配置:
ffvjumwh4#
生产者和代理的默认kafka配置值都非常保守,在一般情况下,您不应该遇到任何超时。这些问题通常都指向生产者和经纪人之间的脆弱/有损网络。
你得到的例外,
Failed to update metadata
,通常意味着生产者无法访问其中一个代理,其结果是无法获取元数据。对于第二个问题,kafka将自动重试发送未被代理完全确认的消息。当应用程序端出现超时时,是否要捕获并重试取决于您自己,但是如果要达到1分钟以上的超时,那么重试可能不会有太大影响。不管怎样,你都必须弄清楚代理的底层网络/可达性问题。
根据我的经验,通常网络问题是:
端口9092被防火墙阻止,在生产者端或代理端,或中间的某个位置(请尝试)
nc -z broker-ip 9092
从运行producer的服务器)dns解析已中断,因此即使端口已打开,生产者也无法解析为ip地址。