为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot 线程挂了?

Spring Boot 线程挂了?

慕村9548890 2021-08-25 16:43:52
我有一个简单的(这就是我认为的)Spring 启动应用程序。有4层:休息控制器应用服务(由 Rest Controller 调用)域服务(由应用服务调用。它连接到数据库-存储库层)Adapter Service(由应用服务通过 Hystrix 进行呼出调用)现在的问题是它最多只能处理 15 个并行调用。如果在处理这些调用时有任何额外的 REST API 请求到达,它会将其发送到应用程序服务层,然后等待。一旦这 15 个并行调用中的一个返回,新请求就会继续调用域服务层并返回。我尝试了多种方法:在 application.properties 文件中增加服务器的空闲线程server.tomcat.min-spare-threads=1000server.tomcat.max-connections=1000server.tomcat.max-threads=1000执行此操作后,我看到 http-nio-* 线程数增加到 1000,但挂起问题并未解决。我在网上找到了这个片段来自定义 tomcat 容器,但它也没有帮助:@Beanpublic 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-* 线程处于等待状态,当一个新请求进来时,它分配了自己的线程,我可以在调试模式下看到这一点。任何指针、帮助、提示都非常感谢。Spring boot 服务到服务调用需要什么资源?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

我相信您的观察是正确的 - 这里的瓶颈很可能不是 tomcat。从你写的,宁可看域服务。域服务是与数据库进行某种通信还是通过网络(例如通过 HTTP)与其他事物通信?

如果您碰巧在那里做数据库,请检查 spring 的数据源配置。将有一个数据库连接池,该池的最大并发连接数有限。一旦这些连接都在使用中,想要与数据库对话的线程将被阻塞,直到连接之一再次空闲。

类似的连接池与许多其他通过网络通信的东西一起存在(例如,Apache HTTP 客户端也有一个可以配置的连接池)。

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


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信