如何製作前端 HTTP 代理以在不停機的情況下執行應用程式維護?

如何製作前端 HTTP 代理以在不停機的情況下執行應用程式維護?

我們有一個 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)

然後刪除舊版本和實例以釋放資源。

相關內容