Tomcat 9-使用非阻塞 IO 连接器时,gracefulStopAwaitMillis 是否*正确*等待请求完成?

Tomcat 9-使用非阻塞 IO 连接器时,gracefulStopAwaitMillis 是否*正确*等待请求完成?

Tomcat 9.0.80+ 使用 NIO 连接器时如何处理正常关闭?

<Connector port="8080" protocol="HTTP/1.1"
       connectionTimeout="20000" 
       gracefulStopAwaitMillis="15000" 
       bindOnInit="false" 
       protocol="org.apache.coyote.http11.Http11NioProtocol" />

我已经在使用 HAproxy 进行重试、重新调度和健康检查。我还配置了 Tomcat 以使用正常关闭和后期绑定(按照建议),让任何反向代理/负载平衡器重新调度到另一个后端。但我不确定它是否真的等待正在处理的请求完成处理后再退出。我的测试表明是这样,但我偶尔会从位于 HAproxy(高级路由、API 网关)前面的面向公众的 ALB(TLS、WAF)收到 HTTP 502,然后一大堆 Tomcat 服务器会滚动重启。

答案1

结论

确实如此不是保证所有请求都将被处理!

据我所知,事情是这样的:

  1. 请求到达反向代理并转发到后端服务器。
  2. 请求被放置在队列中并由线程拾取以进行处理。
  3. 另一个请求被转发给Tomcat,并放置在Tomcat的请求队列中。
  4. 在它被处理线程接收之前,就会启动关闭程序。
  5. 原始请求已经由线程处理 将完成处理(在gracefulStopMillis暂停)。
  6. 第二个请求仍然在排队,将被删除。
  7. 反向代理/负载均衡器将遇到响应超时并返回502给客户。
  8. 除非应用程序真正具有幂等性,否则反向代理无法进行安全重试。

相关内容