java中的pipe或bufferedreader是否有可能丢失数据?

z9smfwbn  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(440)

目标
从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 文件以及std输出,供apachekafka的java生产者使用
这个生产者最终将数据发送到kafka集群,然后发送到amazons3。
这个 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); 
         }    
    }

问题
当比较kafka桶和logrotate桶的每小时日志时,有些日志会断断续续地丢失,没有特定的模式或时间。
可能是因为 pipe 限制或 BufferedReader 限制?怎样才能找到答案?

ztigrdn8

ztigrdn81#

不,一点也不。这个 Reader 与下面的管道或插座一样可靠。如果它是tcp,它不能在不重置连接的情况下丢失数据。

相关问题