如何使前端HTTP代理无需停机即可执行应用程序维护?

我们在Java中有一个Web应用程序(尽pipe这个语言与这个问题并不相关),而且它是Apache通过一个简单代理的前端。

有没有办法排队来自客户端的所有HTTP请求(以便他们的HTTP连接保持而不是丢弃),而我们closuresJava应用服务器(或任何其他容器…)与我们的应用程序。 维护时间<60秒,所以我们的想法是,我们只是部署一个新版本的应用程序,然后说“允许stream量再次回到Web应用程序”,以便客户将遇到延迟,但不是一滴连接 – 作为排队的请求将不会被允许到达我们的应用程序。

更清楚的是,我们不是在这里处理一个网站,但实际上这些是通过HTTP完成的API请求,而客户端实际上是使用支持指定延迟的代码库 – 因此客户端将知道要等待(当我们在做维护)。

你有什么想法? 如果需要的话,如果没有明显的/现成的解决scheme,我们可以开发一个小应用程序,虽然这是一个很普遍的问题,任何人都提供一个HTTP API到他们的客户端。

下面这种原理怎么样? 说这是mod_proxy,确保ProxyTimeout和ProxyPass connectiontimeout =(可能retry =)至less是维护时间或API客户端的空闲超时。

然后,在维护之前,防火墙后端的所有新连接,例如iptables -I INPUT -p tcp --syn --dport 8080 -j DROP 。 维护完成后,使用iptables -D删除规则。

MaxClients可能会保持低点,但是如果客户端的TCP连接超时时间很短,您可能需要增加ListenBackLog

只需在自己的实例中(即在不同的端口上)启动新版本的应用程序,并更新反向代理configuration以将请求redirect到新实例,这可以在没有停机的情况下完成。 ( apachectl reload

然后取下旧版本和实例,释放资源。