使用两个执行程序在Spring Boot中运行并行作业

问题描述 投票:1回答:2

我已经创建了一个Spring Boot应用程序,它将接收作业请求并在后台运行它们。这些作业请求非常密集,如果由单线程处理,则将花费4-5个小时。在内部,这些作业请求具有单独的较小任务,大约在300-400之间。因此,我创建了一个任务执行程序来并行处理它们。它像魅力一样工作,并在35分钟内完成了所有操作。但是,当另一个作业与此作业并行运行时,问题就来了。现在,同一工作需要2个小时。最初,我认为可能是一项工作正在占用所有线程,而等待其他工作。因此,为了解决这个问题,我创建了另一个执行器并将其分配给每个作业。但是没有改善。

顺便说一下,内部任务是内部调用数据库。

下面是任务执行器的配置以及我在方法上的使用方式。

    @Bean(name = "taskExecutor")
    public Executor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(100);
        executor.setMaxPoolSize(200);
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("Thread1-");
        executor.initialize();
        return executor;
    }

    @Bean(name = "exTaskExecutor")
    public Executor exThreadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(30);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("Thread2-");
        executor.initialize();
        return executor;
    }

    @Async("taskExecutor")
    public void job1()
        //do something  
    }

    @Async("exTaskExecutor")
    public void job2()
        //do something  
    }

   //database connections
   spring.datasource.hikari.connectionTimeout=60000
   spring.datasource.hikari.idleTimeout=600000
   spring.datasource.hikari.maxLifetime=1800000 
   spring.datasource.hikari.autoCommit=true
   spring.datasource.hikari.maximumPoolSize=120
   spring.datasource.hikari.connection-test-query: SELECT 1 FROM DUAL

我不明白问题出在哪里?是在任务执行器中还是HikariCP中?我从日志中看到的是,两个执行器的线程在任何时间都不并行运行。非常感谢任何帮助或替代方式。

java oracle spring-boot executorservice hikaricp
2个回答
1
投票

这里的主要问题是您拥有的可用处理器数量,您只能并行运行等于可用处理器数量的n个线程(n == availableProcessors),并且重新组合将同时运行,例如您可以使用RunTime类进行检查>

Runtime.getRuntime().availableProcessors() // In my case 8

我确实拥有总数为4的内核超线程处理器,其中每个内核可以并行处理两个线程,并且扩孔线程将同时运行,you can find the difference between parallel and concurrent,并且您还可以在此处Java threads and number of cores了解更多信息,>

正如@Deadpool所说,您需要了解流程的约束位置。您可能需要扩大规模(例如,一台具有更多cpu的机器)或在多台机器之间扩大规模。向外扩展可能需要类似AkkaZookeeperDocker SwarmKubernetes或其他可伸缩工作管理器的内容。


0
投票

正如@Deadpool所说,您需要了解流程的约束位置。您可能需要扩大规模(例如,一台具有更多cpu的机器)或在多台机器之间扩大规模。向外扩展可能需要类似AkkaZookeeperDocker SwarmKubernetes或其他可伸缩工作管理器的内容。

© www.soinside.com 2019 - 2024. All rights reserved.