[英]Kafka topic not received some records from publisher send()
Java 應用程序向 Kafka 集群發送或發布消息。 下面給出了發送記錄的代碼。 由於此應用程序向 kafka 發送大量記錄消息,因此調試起來有點困難。 但是我看到有些消息沒有發送到 kafka,因為我在同一主題的 kafka 代理訂閱者中看不到其中一些消息。 所以看起來這個 pipe 中有一些數據泄漏。
為此,我添加了java.util.concurrent.Future.isDone()
方法來查看響應。 它以錯誤的方式回應。 所以我很困惑到底哪里存在泄漏。 是否無法將記錄發送到kafka? 還是在 Kafka 代理中,在將記錄放入主題之前無法處理記錄?
// setting properties from config xml..
propertiess.put("security.protocol", properties.getProperty("security_protocol"));
properties.put("acks", properties.getProperty("kafka_acks"));
...
...
//Producer initialization
Producer<String, String> producer = new KafkaProducer<>(kprops);
...
...
ProducerRecord<String, String> producerRecord = new ProducerRecord<>(topicName, key, newValue);
Future<RecordMetadata> kafkaResponse = producer.send(producerRecord);
String kafkaSuccessStatus = kafkaResponse.isDone() ? "Sending message to kafka completed" : "Sending message to kafka not completed";
LOGGER.debug(kafkaSuccessStatus);
我正在使用 isDone() 來檢查事件是否成功。 這是正確的做法嗎? 如果沒有,我們是否可以通過其他方式獲得更多信息。 由於我在日志中看不到任何錯誤或信息,因此很難找出到底發生了什么以及數據被丟棄的位置。 我正在使用 kafka-0.11 版本。
關於應用程序的信息:這個應用程序需要每天處理非常大量(數十億)的記錄,並且必須發布到 Kafka 代理。 這是一個多線程應用程序從文件中讀取行並將其發送到 kafka。
標准 Kafka 客戶端在實際發送消息之前對消息進行批處理。 它像客戶端緩存一樣工作。 如果您的應用程序在沒有刷新緩沖區的情況下關閉了客戶端(並一直等到它被實際刷新),您就有丟失消息的風險。 這是您為性能付出的代價。
如果您更看重可靠性而不是性能,您可能會考慮使用老式隊列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.