
우리는 Java로 된 웹 애플리케이션을 가지고 있으며(언어는 이 질문과 실제로 관련이 없지만) 간단한 프록시를 통해 Apache의 프런트엔드입니다.
앱으로 Java 애플리케이션 서버(또는 다른 컨테이너...)를 종료하는 동안 클라이언트의 모든 HTTP 요청을 대기열에 넣어(HTTP 연결이 유지되고 끊어지지 않도록) 방법이 있습니까? 유지 관리에는 60초 미만이 소요되므로 새 버전의 애플리케이션을 배포한 다음 "웹 애플리케이션으로의 트래픽을 다시 허용"하면 고객이 지연을 경험하지만 연결이 끊기지 않도록 하는 것이 아이디어입니다. 대기 중인 요청은 앱에 도달하는 것이 허용되지 않습니다.
더 명확하게 말하면 여기서는 웹사이트를 다루지 않지만 실제로 이는 HTTP를 통해 수행된 API 요청이며 클라이언트는 실제로 지정된 지연을 지원하는 코드 라이브러리를 사용하고 있습니다. 유지 관리).
어떤 아이디어가 있나요? 필요한 경우, 명백하고 기성 솔루션이 없다면 이를 위한 작은 앱을 개발할 수 있습니다. 그러나 이는 기본적으로 클라이언트에 HTTP API를 제공하는 모든 사람이 경험하는 매우 일반적인 문제이지만 말입니다.
답변1
다음과 같은 원리는 어떻습니까? mod_proxy라고 가정하고 ProxyTimeout 및 ProxyPass 연결 시간 초과=(아마도 retry=)가 최소한 유지 관리 시간 또는 API 클라이언트 유휴 시간 초과인지 확인하세요.
그런 다음 유지 관리 전에 백엔드의 모든 새 연결을 방화벽으로 설정합니다 iptables -I INPUT -p tcp --syn --dport 8080 -j DROP
. 유지 관리 후 를 사용하여 규칙을 제거합니다 iptables -D
.
ListenBackLog
MaxClients는 낮게 유지될 수 있지만 클라이언트의 TCP 연결 시간 제한이 짧은 경우에는 늘리는 것이 좋습니다 .
답변2
자체 인스턴스(예: 다른 포트)에서 새 버전의 애플리케이션을 시작하고 역방향 프록시 구성을 업데이트하여 요청을 새 인스턴스로 리디렉션하면 됩니다. 이 작업은 가동 중지 시간 없이 수행할 수 있습니다. ( apachectl reload
)
그런 다음 이전 버전과 인스턴스를 중단하고 리소스를 확보하세요.