Java 弹簧靴挂线?
我有一个简单的(我就是这么想的)Spring启动应用程序。共有4层:Java 弹簧靴挂线?,java,spring,multithreading,spring-boot,Java,Spring,Multithreading,Spring Boot,我有一个简单的(我就是这么想的)Spring启动应用程序。共有4层: 休息控制器 应用程序服务(由Rest控制器调用) 域服务(由应用程序服务调用。它连接到数据库-存储库层) 适配器服务(由应用程序服务通过Hystrix调用出站呼叫) 现在的问题是,它最多只能处理15个并行调用。如果在处理这些调用时有任何额外的REST API请求到达,它会将其发送到应用程序服务层,然后等待。一旦这15个并行调用中的一个返回,那么新请求将继续向域服务层发出调用并返回 我尝试了多种方法: 在application.
server.tomcat.min-spare-threads=1000
server.tomcat.max-connections=1000
server.tomcat.max-threads=1000
@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);
});
}
});
}
};
}
任何指点、帮助和提示都将不胜感激。Spring boot调用服务到服务需要什么资源 我相信你的观察是正确的——很可能不是tomcat成为了这里的瓶颈。从您所写的内容来看,我们更希望看到域服务。域服务是否与数据库进行通信,或者通过网络(例如通过HTTP)与其他对象进行通信 若您碰巧在那个里创建了数据库,那个么请检查spring的数据源配置。将有一个数据库连接池,其最大并发数据库连接数有限。一旦这些连接都被使用,想要与DB对话的线程将被阻塞,直到其中一个连接再次空闲 类似的连接池与许多其他通过网络进行对话的东西一起存在(例如,Apache HTTP客户端也有一个可以配置的连接池) 那就是我接下来要看的地方 干杯,
Matthias提示:获取线程堆栈转储,并使用堆栈跟踪找出线程等待的原因。谢谢你们!就这样。我把hikari游泳池的大小增加到500,它开始工作了。不客气。但是,请注意与数据库的连接太多。如果您的应用程序在生产环境中使用多个实例运行,那么您的数据库不仅需要处理500个并发连接,还需要处理n*500个并发连接。如果有10个实例正在运行,那么将有5000个连接。我建议您尝试一些值,看看从哪里获得最佳结果。是的,我将其拆分为每个env上的#个服务器。
@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;
}