Spring Boot线程挂了吗?

时间:2018-09-02 05:59:25

标签: java spring multithreading spring-boot

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

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

现在的问题是它最多只能处理15个并行调用。如果在处理这些调用时还有其他REST API请求到达,它将进入 Application Service层,然后等待。一旦这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服务调用服务需要什么资源?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

干杯, 马赛厄斯