繁体   English   中英

春天的启动线程挂?

[英]Spring boot thread hanging?

我有一个简单的(我所认为的)Spring Boot应用程序。 共有4层:

  1. 休息控制器
  2. 应用程序服务(由Rest Controller调用)
  3. 域服务(由应用程序服务调用。它连接到数据库-存储库层)
  4. 适配器服务(由应用服务调用,用于通过Hystrix进行的出站呼叫)

现在的问题是它最多只能处理15个并行调用。 如果在处理这些调用时还有其他REST API请求到达,它将进入应用程序服务层 ,然后等待。 一旦这15个并行调用之一返回,则新请求将继续进行以调用域服务层并返回。

我尝试了多种方法:

  1. 在application.properties文件中增加服务器的备用线程

     server.tomcat.min-spare-threads=1000 server.tomcat.max-connections=1000 server.tomcat.max-threads=1000 

完成此操作后,我看到http-nio- *线程的数量增加到1000,但是挂起的问题没有得到解决。

  1. 我在网上找到了此代码片段以自定义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); }); } }); } }; } 
  2. 我尝试通过代码配置线程池

     @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服务调用服务需要什么资源?

我相信您的观察是正确的-最有可能不是tomcat的瓶颈所在。 从您写的内容来看,宁愿看一下域服务。 域服务是与数据库进行某种通信还是通过网络(例如通过HTTP)与其他事物进行通信?

如果您恰好在那儿做数据库,请检查spring的数据源配置。 将有一个数据库连接池,该数据库连接池具有到数据库的最大最大并发连接数。 一旦所有这些连接都被使用,将要与数据库通信的线程将被阻塞,直到其中一个连接再次变为空闲。

类似的连接池与通过网络进行通信的许多其他事物(例如,Apache HTTP Client也具有可以配置的连接池)一起存在。

那就是我接下来要看的地方。

干杯,马蒂亚斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM