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
结论
确实如此不是保证所有请求都将被处理!
据我所知,事情是这样的:
- 请求到达反向代理并转发到后端服务器。
- 请求被放置在队列中并由线程拾取以进行处理。
- 另一个请求被转发给Tomcat,并放置在Tomcat的请求队列中。
- 在它被处理线程接收之前,就会启动关闭程序。
- 这原始请求已经由线程处理 将完成处理(在gracefulStopMillis暂停)。
- 这第二个请求仍然在排队,将被删除。
- 反向代理/负载均衡器将遇到响应超时并返回502给客户。
- 除非应用程序真正具有幂等性,否则反向代理无法进行安全重试。