我有一个简单的(我所认为的)Spring Boot应用程序。有4层:
现在的问题是它最多只能处理15个并行调用。如果在处理这些调用时还有其他REST API请求到达,它将进入 Application Service层,然后等待。一旦这15个并行调用之一返回,则新请求继续进行,以调用域服务层并返回。
我尝试了很多事情:
在application.properties文件中为服务器增加备用线程
server.tomcat.min-spare-threads=1000
server.tomcat.max-connections=1000
server.tomcat.max-threads=1000
执行此操作后,我看到http-nio- *线程的数量增加到1000,但是挂起的问题没有得到解决。
我在网上找到了此片段以自定义tomcat容器,但它也无济于事:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> containerCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Arrays.stream(connector.getProtocolHandler().findUpgradeProtocols())
.filter(upgradeProtocol -> upgradeProtocol instanceof Http2Protocol)
.map(upgradeProtocol -> (Http2Protocol) upgradeProtocol)
.forEach(http2Protocol -> {
http2Protocol.setMaxConcurrentStreamExecution(1000);
});
}
});
}
};
}
我尝试通过代码配置线程池
@Bean(name = "taskExecutor")
public TaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(200);
executor.setMaxPoolSize(300);
executor.setQueueCapacity(300);
executor.setThreadNamePrefix("anniversary");
executor.initialize();
System.out.println("******* name " + executor.getThreadNamePrefix());
System.out.println("********** core pool size " + executor.getCorePoolSize());
return executor;
}
但是,这都无济于事,我认为问题不在于线程数,而在于其他地方,因为请求无法从一种服务转移到另一种服务。有数百个处于等待状态的http-nio- *线程,当有新请求进入时,它分配了自己的线程,我可以在Debug模式下看到它。
任何指针,帮助和技巧都将不胜感激。 Spring Boot服务调用服务需要什么资源?
答案 0 :(得分:1)
我相信您的观察是对的-很可能不是tomcat的瓶颈所在。从您写的内容来看,宁愿看一下域服务。域服务是与数据库进行某种通信还是通过网络(例如通过HTTP)与其他事物进行通信?
如果您恰好在其中进行数据库检查,请检查spring的数据源配置。将有一个数据库连接池,该数据库连接池具有到数据库的最大最大并发连接数。一旦所有这些连接都被使用,将要与数据库通信的线程将被阻塞,直到其中一个连接再次变为空闲。
类似的连接池与通过网络进行通信的许多其他事物一起存在(例如,Apache HTTP Client也具有可以配置的连接池)。
那是我接下来要看的地方。
干杯, 马赛厄斯