簡體   English   中英

Azure eventthub Kafka org.apache.kafka.common.errors.TimeoutException 對於一些記錄

[英]Azure eventhub Kafka org.apache.kafka.common.errors.TimeoutException for some of the records

有一個包含 80 到 100 條記錄的 ArrayList 嘗試 stream 並將每個單獨的記錄(POJO,不是整個列表)發送到 Kafka 主題(事件中心)。 安排一個像每小時一樣的 cron 作業將這些記錄(POJO)發送到事件中心。

能夠看到正在發送到 eventthub 的消息,但是在成功運行 3 到 4 次后出現以下異常(其中包括正在發送的幾條消息和幾條失敗並出現以下異常)

    Expiring 14 record(s) for eventhubname: 30125  ms has passed since batch creation plus linger time

以下是使用的 Producer 的配置,

    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    props.put(ProducerConfig.ACKS_CONFIG, "1");
    props.put(ProducerConfig.RETRIES_CONFIG, "3");

Message Retention period - 7 Partition - 6 使用 spring Kafka(2.2.3) 發送標記為@Async的事件方法,其中寫有kafka send

    @Async
    protected void send() {
       kafkatemplate.send(record);
    }

預期 - 不會從 kafka 拋出異常實際 - org.apache.kafka.common.errors.TimeoutException 被拋出

Prakash - 我們已經看到了一些問題,其中尖峰的生產者模式看到批處理超時。

這里的問題是生產者有兩個 TCP 連接可以 go 空閑超過 4 分鍾 - 那時,Azure 負載平衡器關閉空閑連接。 Kafka 客戶端不知道連接已關閉,因此它嘗試在死連接上發送批處理,該連接超時,此時重試開始。

  • 將connections.max.idle.ms設置為< 4mins——這允許Kafka客戶端的網絡客戶端層為生產者的消息發送TCP連接優雅地處理連接關閉
  • 將 metadata.max.age.ms 設置為 < 4 分鍾——這實際上是生產者元數據 TCP 連接的保持活動狀態

請隨時與 Github 上的 EH 產品團隊聯系,我們非常擅長回應問題 - https://github.com/Azure/azure-event-hubs-for-kafka

此異常表明您正在以比發送記錄更快的速度排隊記錄。 將記錄添加到批次后,發送該批次有一個時間限制,以確保它已在指定的持續時間內發送。 這由 Producer 配置參數 request.timeout.ms 控制。 如果批處理的排隊時間超過了超時限制,則會拋出異常。 該批次中的記錄將從發送隊列中刪除。

請檢查以下類似問題,這可能會有所幫助。

Kafka 生產者 TimeoutException: Expiring 1 record(s)

你也可以檢查這個鏈接

when-does-the-apache-kafka-client-throw-a-batch-expired-exception/34794261#34794261 了解有關批次過期異常的更多詳細信息

還要實施適當的重試策略。

請注意,這不考慮掃描儀端的任何網絡問題。 由於網絡問題,您將無法發送到任一集線器。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM