【问题标题】:Spring Batch Best Architecture to Read XMLSpring Batch 读取 XML 的最佳架构
【发布时间】:2020-08-16 16:56:34
【问题描述】:

在 Spring Batch 中读取 XML 的最佳性能架构是什么?每个 XML 大小约为 300 KB,我们正在处理 100 万个。

我们目前的方法

  1. 30 个分区和 30 个网格,每个从站获得 166 个 XMLS

  2. 提交块 100

  3. 应用程序启动内存为 8 GB

  4. 在阅读器默认 Bean 范围内使用 JAXB

@StepScope
@Qualifier("xmlItemReader")
public IteratorItemReader<BaseDTO> xmlItemReader(
        @Value("#{stepExecutionContext['fileName']}") List<String> fileNameList) throws Exception {
    String readingFile = "File Not Found";
    logger.info("----StaxEventItemReader----fileName--->" + fileNameList.toString());
    List<BaseDTO> fileList = new ArrayList<BaseDTO>();
    for (String filePath : fileNameList) {
        try {
            readingFile = filePath.trim();
            Invoice bill = (Invoice) getUnMarshaller().unmarshal(new File(filePath));
            UnifiedInvoiceDTO unifiedDTO = new UnifiedInvoiceDTO(bill, environment);
            unifiedDTO.setFileName(filePath);
            BaseDTO baseDTO = new BaseDTO();
            baseDTO.setUnifiedDTO(unifiedDTO);
            fileList.add(baseDTO);
        } catch (Exception e) {
            UnifiedInvoiceDTO unifiedDTO = new UnifiedInvoiceDTO();
            unifiedDTO.setFileName(readingFile);
            unifiedDTO.setErrorMessage(e);
            BaseDTO baseDTO = new BaseDTO();
            baseDTO.setUnifiedDTO(unifiedDTO);
            fileList.add(baseDTO);
        }
    }
    return new IteratorItemReader<>(fileList);
}

我们的问题:

  1. 此架构是否正确
  2. 与 JAXB 相比,使用 StaxEventItemReader 和 XStreamMarshaller 是否有任何性能或架构优势。
  3. 如何正确处理内存以避免变慢

【问题讨论】:

  • 您是否考虑过为每个文件创建一个作业?就可重启性、性能、可扩展性以及让一件事做好一件事并做好的所有充分理由而言,这是 IMO 的最佳选择。
  • 我们在 *.txt 文件中接收 XML 文件路径。每个 txt 文件平均有 5000 到最大 10000 个 XML 文件路径。每个 txt 文件都在创建一个 Job 和 30 个 Slave。 SELECT * FROM BATCH_JOB_EXECUTION WHERE JOB_EXECUTION_ID=13492; -- 每个 txt 文件 SELECT count(STEP_EXECUTION_ID ) FROM BATCH_STEP_EXECUTION WHERE JOB_EXECUTION_ID=13492 AND STEP_NAME NOT IN('masterStep','moveFiles'); -- 31 个奴隶
  • 您能否建议一下,您是说要为每个 *.txt 文件(1 个 txt 文件中的多个 XML 文件路径)创建一个作业,并且每个从属分区将处理 1 个 XML。在这种情况下,BATCH_STEP_EXECUTION 有大量记录,因为我们有 500 万个 XMLS。
  • 我添加了一个包含更多细节的答案。如果有帮助请采纳:stackoverflow.com/help/someone-answers.

标签: spring spring-boot jaxb spring-batch


【解决方案1】:

我将通过使用文件名作为作业参数为每个 xml 文件创建一个作业。这种方法有很多好处:

  • 可重新启动性:如果作业失败,您只需重新启动失败的文件(从中断处开始)
  • 可扩展性:这种方法允许您并行运行多个作业。如果单台机器不够用,可以将负载分散到多台机器上
  • 日志记录:日志在设计上是分离的,您无需使用 MDC 或任何其他技术来分离日志

我们在 *.txt 文件中接收 XML 文件路径

您可以创建一个迭代这些行的脚本并在每行(也就是每个文件)启动一个作业。 Gnu Parallel(或类似工具)是并行启动作业的好选择。

【讨论】:

  • 谢谢马哈茂德。我将验证性能并确认。我们只有 1 台服务器,但功能非常强大,配备 96 个 CPU 和 350GB RAM。我们有近 500 万个 XML,这种方法在 BATCH_STEP_EXECUTION 中创建了 500 万条记录。我们需要检查上述计数增加对数据库 IO 的影响。
  • 那不是服务器,那是野兽 :-) 尝试对每个作业平均所需的资源进行预分析(取决于输入文件大小、项目大小、块大小等)并相应地设置 JVM 内存参数。这样,您的服务器应该可以毫无问题地处理所有工作负载。
  • Mahmoud 我完成了开发并通过您的解决方案极大地改变了性能。现在处理具有本地分区的文件中的一张一张发票。我们的性能已更改为每小时 150 万次插入多个表。再次感谢您的真正支持。
猜你喜欢
  • 2014-09-05
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多