在Spring Boot中增加Tomcat的连接超时

for*_*rtm 5 java spring tomcat gatling spring-boot

如何增加超时,以便在处理响应之前,请求不超时?

Spring Boot中的Tomcat设置:

server.tomcat.max-connections=2000
server.tomcat.max-threads=200
server.connection-timeout=1200000
Run Code Online (Sandbox Code Playgroud)

constantUsersPerSec(20) during (15)在15秒的过程中,每秒的请求数增加到300,并且所有请求均得到满足,如下面的加特林(蓝色)所示。

scn.inject(
      constantUsersPerSec(20) during (15), 
    )
Run Code Online (Sandbox Code Playgroud)

这是由于max-connections = 2000使用200工作线程处理了300个请求。

控制器是用Spring MVC编写的,它返回后DeferredResult会执行异步请求处理,因此一旦响应被处理,它将恢复响应。

每秒请求数

但是,即使server.connection-timeout将其设置为较高的数字,1200000也有很多503即将结束(红色)

> status.find.in(200,304,201,202,203,204,205,206,207,208,209), b     78 (100.0%)
ut actually found 503
Run Code Online (Sandbox Code Playgroud)

每秒响应

Gatling.conf也设置为增加超时:

   timeOut {
      simulation = 8640000 # Absolute timeout, in seconds, of a simulation
    }
    ahc {
      #keepAlive = true                                # Allow pooling HTTP connections (keep-alive header automatically added)
      connectTimeout = 600000                          # Timeout when establishing a connection
      handshakeTimeout = 600000                        # Timeout when performing TLS hashshake
      pooledConnectionIdleTimeout = 600000             # Timeout when a connection stays unused in the pool
      readTimeout = 600000                             # Timeout when a used connection stays idle
      #maxRetry = 2                                    # Number of times that a request should be tried again
      requestTimeout = 600000           
Run Code Online (Sandbox Code Playgroud)

for*_*rtm 2

根据Rcordoval的评论-

检查此属性: spring.mvc.async.request-timeout= # 异步请求处理超时之前的时间量

此设置有助于其余的加特林配置

spring.mvc.async.request-timeout=1200000
Run Code Online (Sandbox Code Playgroud)

然而,根本原因是,当请求数量很大时,所有工作线程(200)都会被上传打开的连接(2000)占用(控制器将 MultipartFile 作为参数并返回 DeferredResult )

我认为DeferredResult当请求服务逻辑很快而业务逻辑很慢(在 forkjoin.commonPool 上运行)时会发光。它不太适合 MultiPartFile 上传(阻塞且缓慢),而且当文件大小很大时,响应不会很快恢复(如上面的每秒响应图表所示,只有在几秒钟后响应才开始恢复,因为打开连接)是 2000 人,工人只有 200 人)。如果增加工作人员,无论如何都会削弱异步处理的优势。

在这种情况下,请求处理(上传和阻塞)很慢,而业务逻辑很快。因此响应已准备就绪,但所有工作线程 (200) 都忙于服务越来越多的请求,导致响应无法恢复并因此超时。

可能需要为DeferredResult 的异步处理request serve提供单独的池?response resume