java 中的管道或 BufferedReader 是否可能丢失数据?

Is pipe or BufferedReader in java likely to loose data?

瞄准

从 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 文件以及标准输出中,供 Apache kafka java 生产者使用

这个生产者最终将数据发送到kafka集群,然后是amazon S3。

error_log 文件被旋转,然后也使用 logrotate

存储在 S3 上

生产者代码

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 限制?有什么方法可以找出来?

没有。甚至没有一点。 Reader 与底层管道或套接字一样可靠。如果是 TCP,则在不重置连接的情况下不会丢失数据。