簡體   English   中英

Kafka 主題未收到來自發布者發送()的一些記錄

[英]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.

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