用于处理50k文件的弹簧批量设计建议

时间:2015-09-12 21:53:27

标签: spring-integration spring-batch

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

  1. 轮询应用程序从ftp区域连续选择文件。
  2. 验证该文件并在db table中创建元数据。
  3. 另一个轮询器从db中选择10-20个文件(仅文件ID和状态)并将其作为消息传递给从属应用程序
  4. Slave app接收消息并启动弹出批处理作业,该作业正在读取数据,在处理器中进行商业验证并将经过验证的数据写入db / other文件。
  5. 我们为此POC使用了弹簧集成和弹簧批量技术

    在slave中启动spring批处理作业或直接实现read,process和write logic作为计划java或spring bean对象是一个好主意吗?

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

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

1 个答案:

答案 0 :(得分:2)

通常,使用SpringIntegration和SpringBatch进行此类任务是个好主意。这就是他们的目的。

关于SpringBatch,您可以立即获得整个重试,跳过和重新启动处理。此外,您拥有针对批量操作进行了优化的所有这些读者和编写者。这非常有效,你只需要专注于编写适当的映射器和这样的东西。

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

关于您的设计: 除了验证和创建元数据条目外,您还可以考虑将条目直接加载到数据库表中。这会给你一个更好的"交易"控制,如果出现问题。您的加载工作可能如下所示:
第一步:
用于在元数据表中创建条目的tasklet,其中包含

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


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

  
      
  • DATA:........
  •   
  • 状态:
  •   
  • FK_META_TABLE:对元表的ForeignKey
  •   


步骤3:
更新metatable状态LOAD_completed

  

-STATE:LOAD_COMPLETED

因此,只要您的metatable条目获得LOAD_COMPLETED状态,就会知道文件的所有条目都已经过验证,可以进行进一步处理。 如果某些内容失败,您只需修复该文件并重新加载即可。

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

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