繁体   English   中英

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

[英]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 毫秒

我有以下问题:

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

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

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

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

提前致谢。

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

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

  2. 网络连接问题。 这可以通过telnet broker_host borker_port轻松诊断

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

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

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

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

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

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

你得到的例外, Failed to update metadata ,通常意味着生产者无法访问其中一个经纪人,结果是它无法获得元数据。

对于您的第二个问题,Kafka 将自动重试发送代理未完全确认的消息。 如果您想在应用程序端超时时捕获并重试,这取决于您,但如果您达到 1 分钟以上的超时,重试可能不会产生太大影响。 无论如何,您将不得不弄清楚代理的底层网络/可达性问题。

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

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

我建议在构建 Producer config 时使用以下属性

需要来自分区的确认 - 领导者

卡夫卡.acks=1

kafka 生产者发送消息和接收来自领导者的确认的最大重试次数

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM