亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號