有一個包含 80 到 100 條記錄的 ArrayList,嘗試流式傳輸并將每個單獨的記錄(POJO,不是整個列表)發送到 Kafka 主題(事件中心)。安排一個 cron 作業,例如每小時將這些記錄 (POJO) 發送到事件中心。能夠看到消息發送到 eventhub ,但在 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");消息保留期 - 7 分區 - 6 使用 spring Kafka(2.2.3) 發送標記為@Asynckafka send 寫入位置的事件方法 @Async protected void send() { kafkatemplate.send(record); }預期 - kafka 不會拋出異常 實際 - 拋出 org.apache.kafka.common.errors.TimeoutException
2 回答

萬千封印
TA貢獻1891條經驗 獲得超3個贊
Prakash - 我們已經看到了許多問題,其中尖峰生產者模式會出現批處理超時。
這里的問題是生產者有兩個 TCP 連接可以空閑超過 4 分鐘 - 此時,Azure 負載均衡器會關閉空閑連接。Kafka 客戶端不知道連接已關閉,因此它嘗試在失效連接上發送批處理,該連接超時,此時將開始重試。
將connections.max.idle.ms設置為<4分鐘——這允許Kafka客戶端的網絡客戶端層優雅地處理生產者消息發送TCP連接的連接關閉
將metadata.max.age.ms設置為<4分鐘——這實際上是生產者元數據TCP連接的保持活動狀態

長風秋雁
TA貢獻1757條經驗 獲得超7個贊
此異常表明您對記錄進行排隊的速度快于發送記錄的速度。將記錄添加到批次后,發送該批次就有一個時間限制,以確保它已在指定的持續時間內發送。這是由 Producer 配置參數 request.timeout.ms 控制的。如果批次排隊時間超過超時限制,則會拋出異常。該批次中的記錄將從發送隊列中刪除。
添加回答
舉報
0/150
提交
取消