
私たちは Java で Web アプリケーションを作成しています (ただし、この言語はこの質問にはあまり関係ありません)。これは、単純なプロキシを介して Apache によってフロントエンド化されています。
アプリケーションで Java アプリケーション サーバー (またはその他のコンテナー) をシャットダウンしている間、クライアントからのすべての HTTP 要求をキューに入れる (HTTP 接続が維持され、切断されないようにする) 方法はありますか。メンテナンスには 60 秒未満しかかからないため、新しいバージョンのアプリケーションを展開し、「Web アプリケーションへのトラフィックを再び許可する」というアイデアです。これにより、キューに入れられた要求はアプリケーションに到達できないため、顧客は遅延を経験することになりますが、接続が切断されることはありません。
もっと明確に言うと、ここでは 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
。
ListenBackLog
MaxClients は低いままでもかまいませんが、クライアントの TCP 接続タイムアウトが短い場合は増やしたほうがよいかもしれません。
答え2
新しいバージョンのアプリケーションを独自のインスタンスで(つまり、別のポートで)起動し、リバース プロキシ構成を更新してリクエストを新しいインスタンスにリダイレクトするだけです。これはダウンタイムなしで実行できます。(apachectl reload
)
次に、古いバージョンとインスタンスを削除して、リソースを解放します。