处理 Kafka Producer 超时异常的指南?

xab*_*bhi 7 java timeoutexception apache-kafka kafka-producer-api

由于我的 Kafka 制作人的各种原因,我经常收到超时异常。我目前正在使用生产者配置的所有默认值。

我见过以下超时异常:

org.apache.kafka.common.errors.TimeoutException:60000 毫秒后无法更新元数据。

org.apache.kafka.common.errors.TimeoutException:主题 1-​​0 的 1 条记录到期:自上次追加以来已经过去了 30001 毫秒

我有以下问题:

  1. 这些超时异常的一般原因是什么?

    1. 临时网络问题
    2. 服务器问题?如果是,那么什么样的服务器问题?
  2. 处理超时异常的一般准则是什么?

    1. 设置“重试”配置以便 Kafka API 进行重试?
    2. 增加 'request.timeout.ms' 或 'max.block.ms' ?
    3. 捕获异常并让应用程序层重试发送消息,但这对于异步发送似乎很难,因为消息将被乱序发送?
  3. 超时异常是可重试的异常吗?重试它们是否安全?

我正在使用 Kafka v2.1.0 和 Java 11。

提前致谢。

yuy*_*ang 5

“这些超时异常的一般原因是什么?”

  1. 我之前看到的最常见原因是元数据信息过时:一个代理发生故障,该代理上的主题分区故障转移到其他代理。但是,主题元数据信息尚未正确更新,客户端仍尝试与失败的代理通信以获取元数据信息或发布消息。这会导致超时异常。

  2. 网络连接问题。这可以很容易地诊断出来telnet broker_host borker_port

  3. 经纪人超载。如果代理因高工作负载而饱和,或托管太多主题分区,则可能会发生这种情况。

对于超时异常的处理,一般的做法是:

  1. 排除经纪人方面的问题。确保主题分区已完全复制,并且代理未超载

  2. 修复主机名解析或网络连接问题(如果有)

  3. 调整诸如 等参数request.timeout.msdelivery.timeout.ms我过去的经验是默认值在大多数情况下都可以正常工作。


mju*_*rez 3

生产者和代理的默认 Kafka 配置值都足够保守,在一般情况下,您不应该遇到任何超时。这些问题通常表明生产商和经纪人之间的网络不稳定/有损。

您收到的异常Failed to update metadata通常意味着生产者无法访问其中一个代理,其结果是它无法获取元数据。

对于第二个问题,Kafka 将自动重试发送代理未完全确认的消息。当应用程序端超时时,您是否想捕获并重试,这取决于您,但如果您达到 1 分钟以上的超时,重试可能不会产生太大影响。无论如何,您都必须找出经纪人的潜在网络/可达性问题。

根据我的经验,网络问题通常是:

  • 端口 9092 被防火墙阻止,无论是在生产者端还是在代理端,或者在中间的某个位置(nc -z broker-ip 9092从运行生产者的服务器尝试)
  • DNS 解析已损坏,因此即使端口打开,生产者也无法解析为 IP 地址。