首页 > 解决方案 > 大文件处理 - 从故障点恢复

问题描述

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

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

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

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

我们对想法和建议持开放态度。提前致谢。

标签: javaapache-camel

解决方案


据我所知,骆驼文件组件无法从故障点恢复。

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

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

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

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

如果您仍然遇到文件导入失败,则会从头开始重新处理文件。因此,您应该设计您的处理管道幂等。例如,检查现有记录,如果已经存在,则更新它,而不是仅插入每条记录。

在消息传递环境中,您必须处理至少一次传递语义。唯一的解决方案是具有幂等组件。即使 Camel 会尝试在故障点恢复,它也不能保证每条记录都只读取一次。


推荐阅读