我有一個簡單的(這就是我認為的)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 客戶端也有一個可以配置的連接池)。
那就是我接下來要看的地方。
添加回答
舉報
0/150
提交
取消