
Wir haben eine Webanwendung in Java (obwohl die Sprache für diese Frage nicht wirklich relevant ist) und das Frontend wird über einen einfachen Proxy von Apache bereitgestellt.
Gibt es eine Möglichkeit, alle HTTP-Anfragen der Clients in die Warteschlange zu stellen (sodass ihre HTTP-Verbindung aufrechterhalten und nicht unterbrochen wird), während wir den Java Application Server (oder einen anderen Container ...) mit unserer App herunterfahren? Die Wartung dauert weniger als 60 Sekunden. Die Idee ist also, dass wir einfach eine neue Version der Anwendung bereitstellen und dann sagen: „Den Datenverkehr zur Webanwendung wieder zulassen“, sodass die Kunden eine Verzögerung, aber keinen Verbindungsabbruch erleben – da die in die Warteschlange gestellten Anfragen unsere App nicht erreichen dürfen.
Um es klarer zu sagen: Wir haben es hier nicht mit einer Website zu tun, sondern es handelt sich tatsächlich um API-Anfragen, die über HTTP erfolgen, und die Clients verwenden tatsächlich Codebibliotheken, die die angegebene Verzögerung unterstützen – die Clients wissen also, dass sie warten müssen (während wir die Wartung durchführen).
Haben Sie Ideen? Bei Bedarf können wir hierfür eine kleine App entwickeln, wenn es keine offensichtliche/Standardlösung gibt, obwohl dies ein sehr häufiges Problem ist, das grundsätzlich jeder erlebt, der seinen Kunden eine HTTP-API zur Verfügung stellt.
Antwort1
Wie wäre es mit folgendem Prinzip? Angenommen, es ist mod_proxy, stellen Sie sicher, dass ProxyTimeout und ProxyPass connectiontimeout= (und wahrscheinlich retry=) mindestens der Wartungszeit oder dem Leerlauf-Timeout des API-Clients entsprechen.
Versehen Sie dann vor der Wartung alle neuen Verbindungen auf dem Backend mit einer Firewall, z. B. iptables -I INPUT -p tcp --syn --dport 8080 -j DROP
. Entfernen Sie nach der Wartung die Regel mit iptables -D
.
MaxClients könnte möglicherweise niedrig bleiben, Sie möchten den Wert aber möglicherweise erhöhen, ListenBackLog
wenn das TCP-Verbindungstimeout im Client kurz ist.
Antwort2
Starten Sie einfach die neue Version der Anwendung in ihrer eigenen Instanz (also auf einem anderen Port) und aktualisieren Sie die Reverse-Proxy-Konfiguration, um Anfragen an die neue Instanz umzuleiten. Dies ist ohne Ausfallzeiten möglich. ( apachectl reload
)
Entfernen Sie dann die alte Version und Instanz, um die Ressourcen freizugeben.