2017-03-15 114 views
0

目的java中的pipe或BufferedReader可能會丟失數據嗎?

要閱讀所有的Apache服務器和存儲日誌上S3

背景

我們有以下的httpd.conf

ErrorLog "| /usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/java -cp /usr/local/bin/CustomProducer/producer-1.0-SNAPSHOT-jar-with-dependencies.jar stdin.producer.StdInProducer /usr/local/bin/CustomProducer/Config.json >> /var/log/producer_init.log 2>&1"

這使得語句登錄error_log文件以及標準輸出將由java生產者爲Apache kafka使用

該生產者最終將數據發送到kafka集羣,然後是amazon S3。

error_log文件被旋轉,然後也使用存儲在S3 logrotate

生產者代碼

this.stdinReader = new BufferedReader(new InputStreamReader(System.in)); 
try { 
     while ((msg = this.stdinReader.readLine()) != null) { 
       //Some processing which may introduce some delay 
       //Send message to cluster 
       this.producer.send(message); 
     }  
    } 

問題

當每小時日誌從卡夫卡桶和logrotate的桶相比有些日誌間歇性缺失,沒有特定的模式或時間。

是否可能由於pipe限制或BufferedReader限制?有什麼方法可以找到答案?

+0

只是一個想法。當涉及到一個普通的linux管道時,最慢的管道使用者通常會阻止生產者的輸出,這可能不是整個Apache日誌子系統和/或ErrorLog指令的特例。 – Osw

回答

0

不,甚至沒有。 Reader與下面的管道或插座完全一樣可靠。如果是TCP,它不會丟失數據而不重置連接。

+0

那麼如果在循環內部發送消息之前有一些延遲才能讀取下一個消息,會發生什麼。它是否有足夠的緩衝區來容納這些消息? – Confused

+1

TCP有流量控制。最終,發件人會停下來,或者被告知再試一次,具體取決於它的寫法。 – EJP