Tomcat 关闭期间 HTTP 请求被阻止

HTTP requests held up during Tomcat shutdown

我遇到 Tomcat 关机问题。请求到达时 servlet 容器正在关闭似乎被连接器阻止 直到容器关闭完成。

问题是,我们的 servlet 最多可能需要一分钟才能关闭,这意味着 在此期间到达的连接最多保留一分钟。

这是 correct/expected 的行为吗?

Tomcat 关机行为不理想

  1. 让现有请求 完成(因为它已经完成),但是
  2. 拒绝新连接(而不是 接受并持有它们)?

这是正确的行为。只要客户端看到服务器在给定端口启动,它就会发送请求。

服务器只要启动就会接受请求。因此,在关闭过程中收到的一些请求将被收到但不会被完全处理。

如果您想优雅地处理这些请求,您将需要实现自己的机制。您可以使用 JMS 队列或过滤器。第一个请求接收过滤器会先存储(db/serialize)请求,然后处理它。稍后当服务器重新启动时,您可以检查未处理的请求,您可以处理它们或通知客户端它失败了。

显然,您不是唯一注意到/评论此行为的人;查看此 "tomcat-user" 帖子:

(事实上,该帖子与您的问题之间的相似之处表明您与 Andry Eng 之间存在某种联系......)

很明显,这在某种意义上是 "expected" 行为。

是不是"correct"见仁见智。如果 Tomcat 开发人员不同意您的意见,则没有实际意义。

而且,就其价值而言,在这里发布关于 "ideal" 行为的反问也没有实际意义。显然,Tomcat 开发人员要么不在 Whosebug / "tomcat-users" 中闲逛……要么他们不愿意讨论这个问题。


那么你有什么可能的解决方案?

  • 这个链接的问答解释了一个解决方法 - How to process servlet requests during long shutdown

  • 您可以在 Tomcat 问题跟踪器上提出问题。问题是您的问题可能会在清单上停留数月或数年才能得到解决。或者它可以是 "dismissed".

    但是,过去似乎没有人将此作为问题提交。

  • 您可以弄清楚如何修改 Tomcat 以在关机期间拒绝新请求。然后将您的(测试过的)更改作为补丁提交。

  • 您可以雇人代劳。例如,查看此处列出的人员/组织:http://wiki.apache.org/tomcat/SupportAndTraining.

这可不是什么好行为。关闭时它应该停止接受新连接,但我想在实现它时存在一些技术挑战。没有实际意义,无论如何如前所述。

我们是如何度过难关的:

  1. 我们的 tomcat 前面有 Web 服务器。把它做好,如果你不这样做,就做长期计划,这是我的建议。
  2. 有办法告诉 Web 服务器从其循环实例列表中删除一个节点(tomcat 实例)。
  3. 3-4 分钟后,tomcat 节点应该空闲(没有新连接和旧连接完成)。我们有一个基于 http://www.quickserver.org/ 的自定义 Web 服务器,它让后端 tomcat 完成进程连接,但停止为其提供新连接。
  4. 当维护结束时,我们在代理上有另一项服务可以将 tomcat 添加回活动服务器的 Web 服务器列表。

在我们的例子中,我们有办法告诉服务器重新加载他们的配置。其他服务器似乎有相同的 https://serverfault.com/questions/108261/how-to-make-modification-take-affect-without-restart-nginx