大文件处理 - 从失败点恢复

Large File Processing - Resume from the point of failure

我们必须处理大型 CSV 文件。我们使用 Apache Camel 从 SFTP 位置读取文件(但如果有更好的方法,我们愿意接受基于 Java 的解决方案)。

要求之一是从故障点恢复处理。也就是说,如果在处理第 1000 行时发生异常,我们应该从第 1000 行开始处理,而不是从头开始处理。我们也不应该处理记录两次。

我们使用 Apache ActiveMQ 将记录保存在队列中并管理管道。但是从该位置初始加载文件也会导致失败。

为了跟踪状态,我们使用了一个数据库,该数据库将使用 Apache Camel 在每一步进行更新。

我们乐于接受想法和建议。提前致谢。

据我所知,Camel File component 无法从故障点恢复。

这取决于您的配置(请参阅 moveFailed 选项)是否在下一次尝试时移走或重新处理失败的文件(但从头开始)。

要读取 CSV 文件,您需要 split 单行。因为你的文件很大,你应该使用 Splitter 的 streaming 选项。否则在拆分之前读取整个文件!

为了减少整个文件的失败和重新处理的可能性,您可以简单地将每一行 CSV 发送到 ActiveMQ(不解析它)。拆分器越简单,由于单个记录中的问题而需要重新处理整个文件的可能性就越低。

队列的解耦消费者可以在不影响文件导入的情况下解析和处理CSV记录。像这样,您可以处理每条记录的错误。

如果您仍然遇到文件导入失败,将从头开始重新处理文件。因此你应该design you processing pipeline idempotent。例如检查现有记录,如果已经存在,则更新它而不是只插入每条记录。

在消息传递环境中,您必须处理 at-least-once delivery semantics。唯一的解决方案是拥有幂等组件。即使 Camel 会尝试在故障点恢复,也不能保证每条记录只被读取一次。