我们有一个 Java 语言的 Web 应用程序(尽管该语言与这个问题并不真正相关),它通过一个简单的代理由 Apache 充当前端。
有没有办法在我们关闭包含我们应用程序的 Java 应用服务器(或任何其他容器...)时对来自客户端的所有 HTTP 请求进行排队(以便维护它们的 HTTP 连接而不会断开)。维护需要不到 60 秒的时间,所以我们的想法是,我们只需部署新版本的应用程序,然后说“再次允许流量返回到 Web 应用程序”,这样客户就会遇到延迟,但不会出现连接断开的情况 - 因为排队的请求将不被允许到达我们的应用程序。
更清楚地说,我们这里不是在处理网站,而是实际上这些是通过 HTTP 完成的 API 请求,并且客户端实际上正在使用支持指定延迟的代码库 - 因此客户端会知道要等待(当我们进行维护时)。
你有什么想法吗?如果需要,我们可以为此开发一个小应用程序,如果没有明显的/现成的解决方案,尽管这基本上是任何为客户提供 HTTP API 的人都会遇到的一个非常常见的问题。
答案1
那么下面的原则怎么样?假设它是 mod_proxy,确保 ProxyTimeout 和 ProxyPass connectiontimeout=(可能还有 retry=)至少是维护时间或 API 客户端空闲超时。
然后,在维护之前,在后端防火墙上封锁所有新连接,例如iptables -I INPUT -p tcp --syn --dport 8080 -j DROP
。维护后,使用删除规则iptables -D
。
MaxClients 可能会保持较低水平,但ListenBackLog
如果客户端的 TCP 连接超时时间较短,您可能需要增加该值。
答案2
只需在其自己的实例中(即在不同的端口上)启动应用程序的新版本,并更新反向代理配置以将请求重定向到新实例,这可以在不停机的情况下完成。(apachectl reload
)
然后删除旧版本和实例并释放资源。