[英]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 毫秒
我有以下問題:
這些超時異常的一般原因是什么?
處理超時異常的一般准則是什么?
超時異常是可重試的異常嗎?重試它們是否安全?
我正在使用 Kafka v2.1.0 和 Java 11。
提前致謝。
“這些超時異常的一般原因是什么?”
我之前看到的最常見的原因是由於元數據信息過時:一個代理出現故障,並且該代理上的主題分區故障轉移到其他代理。 但是,主題元數據信息尚未正確更新,客戶端仍會嘗試與失敗的代理通信以獲取元數據信息或發布消息。 這會導致超時異常。
網絡連接問題。 這可以通過telnet broker_host borker_port
輕松診斷
經紀人超載。 如果代理因高工作負載而飽和,或者托管太多主題分區,就會發生這種情況。
處理超時異常,一般的做法是:
排除經紀人方面的問題。 確保主題分區完全復制,並且代理沒有過載
修復主機名解析或網絡連接問題(如果有)
調整request.timeout.ms
、 delivery.timeout.ms
等參數。我過去的經驗是默認值在大多數情況下都能正常工作。
生產者和代理的默認 Kafka 配置值足夠保守,在一般情況下,您不應該遇到任何超時。 這些問題通常指向生產者和經紀人之間的脆弱/有損網絡。
你得到的例外, Failed to update metadata
,通常意味着生產者無法訪問其中一個經紀人,結果是它無法獲得元數據。
對於您的第二個問題,Kafka 將自動重試發送代理未完全確認的消息。 如果您想在應用程序端超時時捕獲並重試,這取決於您,但如果您達到 1 分鍾以上的超時,重試可能不會產生太大影響。 無論如何,您將不得不弄清楚代理的底層網絡/可達性問題。
根據我的經驗,通常網絡問題是:
nc -z broker-ip 9092
)我建議在構建 Producer config 時使用以下屬性
卡夫卡.acks=1
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.