【问题标题】:Spring Batch multiple process for heavy load with multiple thread under every processSpring Batch 多进程重负载,每个进程下都有多个线程
【发布时间】:2021-05-07 19:20:00
【问题描述】:

我有一个场景,我需要大约 50-60 个不同的进程同时运行并执行一个任务。

每个进程都必须使用 sql 查询从数据库中获取数据,方法是传递一个值并获取要在后续任务中运行的数据。 select col_1, col_2, col_3 from table_1 where col_1 = :Process_1;

 @Bean
    public Job partitioningJob() throws Exception {
        return jobBuilderFactory.get("parallelJob")
                .incrementer(new RunIdIncrementer())
                .flow(masterStep())
                .end()
                .build();
    }

    @Bean
    public Step masterStep() throws Exception {
        //How to fetch data from configuration and pass all values in partitioner one by one.
        // Can we give the name for every process so that it is helpful in logs and monitoring.
        return stepBuilderFactory.get("masterStep")
                .partitioner(slaveStep())
                .partitioner("partition", partitioner())
                .gridSize(10)
                .taskExecutor(new SimpleAsyncTaskExecutor())
                .build();
    }

    @Bean
    public Partitioner partitioner() throws Exception {
        //Hit DB with sql query and fetch the data.

    }

    @Bean
    public Step slaveStep() throws Exception {
        return stepBuilderFactory.get("slaveStep")
                .<Map<String, String>, Map<String, String>>chunk(1)
                .processTask()
                .build();
    }

由于我们在 Apache Camel 中有 Aggregator 和 parallelProcessing,Spring Batch 是否有任何类似的功能可以完成相同的工作?

我是 Spring Batch 的新手,目前正在探索它是否可以处理卷。 因为这将是一个 24*7 运行的负载繁重的应用程序,并且每个进程都需要同时运行,其中每个线程应该能够支持进程内的多个线程。

有没有办法监控这些进程,让它无论如何都会被终止,我应该能够重新启动那个特定的进程? 请帮忙解决这个问题。

【问题讨论】:

    标签: spring-batch spring-batch-tasklet spring-batch-job-monitoring spring-batch-stream


    【解决方案1】:

    请找出以上问题的答案。

    1. parallelProcessing - 本地和远程分区支持并行处理,并且可以处理大量卷,因为我们目前每天处理 200 到 3 亿个数据。

    2. 它是否可以处理大量 - 是的,这可以处理大量并且已得到充分证明。

    3. 每个进程都需要同时运行,其中每个线程都应该能够支持一个进程中的多个线程 - Spring 批处理将根据您的 ThreadPool 进行处理。确保根据系统资源配置池。

    4. 有没有办法监控这些进程以使其终止 - 是的。分区的每个并行过程都是一个步骤,您可以在 BATCH_STEP_EXECUTION 中监控并了解所有详细信息

    5. 应该能够重新启动该特定进程 - 是的,这是一个内置功能并从失败的步骤重新启动。我们总是使用容错来处理大量作业,以便稍后处理拒绝。这也是内置功能。

    下面的示例项目

    https://github.com/ngecom/springBatchLocalParition/tree/master

    数据库已添加-H2 并在资源文件夹中创建可用表。我们总是更喜欢使用数据源池,池大小将大于您的线程池大小。

    示例项目总结

    1. 从“客户”表中读取并划分为步骤分区
    2. 每一步分区写入新表“new_customer”
    3. JobConfiguration.java 方法名称“taskExecutor()”中可用的线程池配置
    4. slaveStep() 中可用的块大小。
    5. 您可以根据并行步骤计算内存大小并配置为 VM 最大内存。

    查询帮助您在执行后根据以上问题进行分析

    SELECT * FROM NEW_CUSTOMER;   
    SELECT * FROM BATCH_JOB_EXECUTION bje;
    SELECT * FROM BATCH_STEP_EXECUTION bse WHERE JOB_EXECUTION_ID=2; 
    SELECT * FROM BATCH_STEP_EXECUTION_CONTEXT bsec WHERE STEP_EXECUTION_ID=4; 
    

    如果您想更改为 MYSQL,请添加以下数据源

    spring.datasource.hikari.minimum-idle=5 
    spring.datasource.hikari.maximum-pool-size=100
    spring.datasource.hikari.idle-timeout=600000 
    spring.datasource.hikari.max-lifetime=1800000 
    spring.datasource.hikari.auto-commit=true 
    spring.datasource.hikari.poolName=SpringBoot-HikariCP
    spring.datasource.url=jdbc:mysql://localhost:3306/ngecomdev
    spring.datasource.username=ngecom
    spring.datasource.password=ngbilling
    

    请始终参考下面的guthub URL。你会从中得到很多想法。

    https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples

    【讨论】:

    • 感谢您的帮助和建立对该工具的信心。我在将数据从分区传递到步骤时遇到问题。我需要在分区中执行查询,并基于该输出需要创建许多进程,并且在这些进程中使用该输出。一个示例项目会很有帮助。
    • 我将修改上面的答案并添加一个示例项目
    • 感谢 Rakesh 的链接。当我正在探索 Spring Batch 时,这对我很有帮助。
    • 但是,我有一种情况想征求您的意见。由于这些作业将是基于 cron 的,这取决于我是否需要运行此应用程序的另一个实例,那么我如何确保它们不重复。
    • @Override public Map partition(int threadCorePoolSize) { List min = jdbcTemplate.queryForList("SELECT DISTINCT wo.col_name from table_name wo", String.class); Map 结果 = new HashMap(); for(String site : min) { ExecutionContext context = new ExecutionContext(); context.putString(DEFAULT_KEY_NAME, 站点);结果.put(站点,上下文); } 返回结果; }....... 这是我的分区逻辑,这样我就可以并行运行大约 40-50 个线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多