[英]Using two executors to run parallel jobs in Spring boot
我创建了一个 spring 启动应用程序,它将接受作业请求并在后台运行它们。 这些工作请求非常密集,如果它们由单线程处理,它们将需要 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 中? 我从日志中只能看到来自两个执行程序的线程在任何时候都没有并行运行。 非常感谢任何帮助或替代方式。
这里的主要问题是您拥有的可用处理器数量,您只能并行运行n
线程(n == availableProcessors)
等于可用的处理器数量,其余的将同时运行,例如,您可以使用Runtime
class 检查可用的处理器
Runtime.getRuntime().availableProcessors() // In my case 8
我确实有总共4
内核超线程处理器,每个内核可以并行处理两个线程,并且扩孔线程将同时运行, 您可以找到并行和并发之间的区别,您也可以在此处了解更多信息Java 线程和内核数
正如@Deadpool 所说,您需要了解您的流程在哪里受到限制。 您可能需要向上扩展(即具有更多 cpu 的机器)或跨多台机器向外扩展。 横向扩展可能需要Akka 、 Zookeeper 、 Docker Swarm 、 Kubernetes或其他一些可扩展的工作管理器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.