为Kafka Producer处理超时异常的准则?

时间:2019-02-20 07:02:15

标签: java apache-kafka kafka-producer-api timeoutexception

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

我看到了以下超时异常:

  

org.apache.kafka.common.errors.TimeoutException:无法更新   60000 ms之后的元数据。

     

org.apache.kafka.common.errors.TimeoutException:过期1条记录   对于主题-1-0:自上次追加以来已过去30001 ms

我有以下问题:

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

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

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

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

谢谢。

4 个答案:

答案 0 :(得分:2)

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

需要分区领导者的帮助

kafka.acks = 1

kafka制作人可以重试的最大次数,以发送消息并从Leader处收到通知

kafka.retries = 3

每个个人请求的请求超时

timeout.ms = 200

等待再次发送下一个请求;这是为了避免在紧密循环中发送请求;

retry.backoff.ms = 50

完成所有重试的上限

dataLogger.kafka.delivery.timeout.ms = 1200

{"data":[],"owner":"5eeaac70f21e4c2b3a35a8c0","student_field_interest1":"ML","student_field_interest2":"DL","firstname":"Pushkar","lastname":"Jain","contactno":"09991736000","address":"Room no 106 Oxford Caps Upes Road","gender":"Male"}

超时关闭生产者

producer.close(1000,TimeUnit.MILLISECONDS)

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:1)

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

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

  2. Netwowrk连接问题。可以通过telnet broker_host borker_port

  3. 轻松诊断出来
  4. 代理超载。如果代理充满了高工作负载,或者托管了太多主题分区,则可能发生这种情况。

要处理超时异常,通常的做法是:

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

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

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

答案 3 :(得分:1)

如果生产者或消费者无法获得“ advertised.listeners”(protocol:// host:port)的值,则会发生超时异常

通过以下命令检查“ advertised.listeners”属性的配置:

cat $KAFKA_HOME/config/server.properties