正如@Deadpool所说,您需要了解流程的约束位置。您可能需要扩大规模(例如,一台具有更多cpu的机器)或在多台机器之间扩大规模。向外扩展可能需要类似Akka,Zookeeper,Docker Swarm,Kubernetes或其他可伸缩工作管理器的内容。
我已经创建了一个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中?我从日志中看到的是,两个执行器的线程在任何时间都不并行运行。非常感谢任何帮助或替代方式。
这里的主要问题是您拥有的可用处理器数量,您只能并行运行等于可用处理器数量的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的机器)或在多台机器之间扩大规模。向外扩展可能需要类似Akka,Zookeeper,Docker Swarm,Kubernetes或其他可伸缩工作管理器的内容。
正如@Deadpool所说,您需要了解流程的约束位置。您可能需要扩大规模(例如,一台具有更多cpu的机器)或在多台机器之间扩大规模。向外扩展可能需要类似Akka,Zookeeper,Docker Swarm,Kubernetes或其他可伸缩工作管理器的内容。