2017-03-15 1 views
0

目指すjavaのpipeまたはBufferedReaderはデータを失う可能性がありますか?

はS3上のApacheサーバとストアからすべてのログを読むには

背景

我々は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ファイルとApache kafkaのJavaプロデューサが消費するstd out

このプロデューサは、最終的にkafkaクラスタに、次にamazon S3にデータを送信します。

error_logファイルを回転させ、その後も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のバケットから比較され

を使用してS3に保存されます特定のパターンや時間がないと断続的に失われるログがあります。

pipe制限またはBufferedReader制限のためですか?これを見つける方法は何ですか?

+0

ちょっとしたアイデア。通常のlinuxパイプの場合、最も遅いパイプ消費者は通常、プロデューサの出力をブロックします。これは、Apacheロギングサブシステム全体および/またはErrorLogディレクティブの場合には当てはまりません。 – Osw

答えて

0

いいえ少しでも。 Readerは、基になるパイプまたはソケットとまったく同じ信頼性があります。 TCPの場合は、接続をリセットせずにデータを失うことはありません。

+0

それで、次のメッセージを読む前にループ内でメッセージを送信するのに遅延がある場合はどうなりますか?それらのメッセージを格納するのに十分なバッファがありますか? – Confused

+1

TCPにはフロー制御があります。最終的に、送信者は、それがどのように書き込まれたかによって、ストールするか、または再試行するように指示されます。 – EJP

関連する問題