簡體   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