处理kafka生产者超时异常的准则?

nhn9ugyo  于 2021-06-06  发布在  Kafka
关注(0)|答案(4)|浏览(1587)

由于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。
提前谢谢。

41zrol4v

41zrol4v1#

“这些超时异常的一般原因是什么?”
我之前看到的最常见的原因是过时的元数据信息:一个代理宕机,该代理上的主题分区故障转移到其他代理。但是,主题元数据信息尚未正确更新,客户端仍尝试与失败的代理对话以获取元数据信息或发布消息。导致超时异常。
网络连接问题。这很容易被诊断为 telnet broker_host borker_port 经纪人超载了。如果代理的工作负载很高,或者承载了太多的主题分区,则可能会发生这种情况。
要处理超时异常,一般做法是:
排除经纪人方面的问题。确保主题分区被完全复制,并且代理没有过载
修复主机名解析或网络连接问题(如果有)
调整参数,例如 request.timeout.ms , delivery.timeout.ms 我过去的经验是,默认值在大多数情况下都可以正常工作。

toe95027

toe950272#

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

需要分区负责人的确认

kafka.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")
    }
  }
})

关闭生产者超时

生产者。关闭(1000,时间单位。毫秒)

p8h8hvxi

p8h8hvxi3#

如果“advised.listeners”的值(protocol://host:端口)生产者或消费者无法访问
通过以下命令检查属性“Adverted.listeners”的配置:

cat $KAFKA_HOME/config/server.properties
ffvjumwh

ffvjumwh4#

生产者和代理的默认kafka配置值都非常保守,在一般情况下,您不应该遇到任何超时。这些问题通常都指向生产者和经纪人之间的脆弱/有损网络。
你得到的例外, Failed to update metadata ,通常意味着生产者无法访问其中一个代理,其结果是无法获取元数据。
对于第二个问题,kafka将自动重试发送未被代理完全确认的消息。当应用程序端出现超时时,是否要捕获并重试取决于您自己,但是如果要达到1分钟以上的超时,那么重试可能不会有太大影响。不管怎样,你都必须弄清楚代理的底层网络/可达性问题。
根据我的经验,通常网络问题是:
端口9092被防火墙阻止,在生产者端或代理端,或中间的某个位置(请尝试) nc -z broker-ip 9092 从运行producer的服务器)
dns解析已中断,因此即使端口已打开,生产者也无法解析为ip地址。

相关问题