【问题标题】:spring batch design advice for processing 50k files用于处理 50k 文件的 spring 批处理设计建议
【发布时间】:2015-12-09 05:38:11
【问题描述】:

我们每天有超过 5 万个文件需要处理。为此,我们开发了具有类似设计的 POC 应用程序,

  1. 轮询应用从 ftp 区域连续选取文件。
  2. 验证该文件并在 db 表中创建元数据。
  3. 另一个轮询器从 db 中挑选 10-20 个文件(仅文件 ID 和状态)并将其作为消息传递给从属应用
  4. 从属应用程序获取消息并启动一个 Spring 批处理作业,该作业正在读取数据、在处理器中进行 biz 验证并将经过验证的数据写入 db/另一个文件。

我们为此 POC 使用了 Spring 集成和 Spring Batch 技术

在slave中启动spring批处理作业还是直接将读、处理和写逻辑实现为计划java或spring bean对象是个好主意吗?

需要一些关于启动这项工作的见解,其中从机可以有 10-25 个 MDP(弹簧消息驱动的 pojo),并且每个 MDP 都在启动一项工作。

注意:每个文件最多有 30 - 4 万条记录

【问题讨论】:

    标签: spring-integration spring-batch


    【解决方案1】:

    一般来说,对此类任务使用 SpringIntegration 和 SpringBatch 是一个好主意。这就是他们的目的。

    关于 SpringBatch,您可以开箱即用地进行整个重试、跳过和重新启动处理。此外,您拥有所有这些针对批量操作进行了优化的读取器和写入器。这非常有效,您只需专注于编写适当的映射器和类似的东西。

    如果你想使用普通的 java 或 spring bean 对象,你可能最终会自己开发这样的基础设施代码......包括。测试等所需的所有工作。

    关于您的设计: 除了验证和创建元数据条目之外,您还可以考虑将条目直接加载到数据库表中。如果出现故障,这将为您提供更好的“事务”控制。您的加载作业可能如下所示:
    第 1 步:
    tasklet 在元数据表中创建一个条目,其中包含类似的列

    • FILE_TO_PROCESS: XY.txt
    • 状态:START_LOADING
    • 日期:...
    • 尝试:...第一次尝试


    第二步:
    读取并验证文件的每一行并将其存储在数据表中

    • 数据:........
    • 状态:
    • FK_META_TABLE:元表的外键


    第三步:
    更新状态为 LOAD_completed 的元表

    -状态:加载完成

    因此,一旦您的元表条目获得状态 LOAD_COMPLETED,您就知道文件的所有条目都已经过验证并准备好进行进一步处理。 如果出现问题,您只需修复文件并重新加载即可。

    然后,为了进一步处理,您可以让作业定期轮询并检查数据库中是否有应处理的新数据。如果在最后一段时间内加载了多个文件,只需处理所有准备好的文件。 您甚至可以不时地轮询几个从属进程。只需读取元数据表的状态以更新或使用乐观锁定方法来防止多个从站尝试处理相同的条目。

    使用此解决方案,您不需要消息基础架构,仍然可以毫无问题地扩展整个应用程序。

    【讨论】:

    • 关于从属轮询的一些不同意见。对我来说这听起来不是一个好主意,因为: 1. 检查文件是否存在并进行导入可能会很危险,无需特别注意(例如,文件正在传输中,然后您的工作导入了不完整的文件)。 2. 我认为 Spring Batch 作业不适合执行长时间运行的轮询操作。相反,让另一个进程(作业调度程序等)来监视文件的存在(使用适当的文件监视机制进行轮询)并在文件准备好时提交 spring 批处理作业是更合理的。
    • 我可能不准确。启动批处理作业,执行操作,然后成功或失败停止。批处理作业本身不会轮询或等待事件。这始终是批处理作业之外的逻辑任务,例如spring-integration 或作业调度程序。所以,我同意以上两点。首先,当启动第一个 spring-batch 作业时,文件必须位于其目标位置。其次,调度程序或其他进程必须实现定期启动作业的逻辑。
    • 谢谢 Hansjoerg 和 Adrian。我真的很感谢你对这个设计的洞察力。我将继续使用弹簧集成和弹簧批处理解决方案。非常感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多