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,则在不重置连接的情况下不会丢失数据。
瞄准
从 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
生产者代码
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,则在不重置连接的情况下不会丢失数据。