
Temos uma aplicação web em Java (embora a linguagem não seja realmente relevante para esta questão), e é frontend pelo Apache através de um proxy simples.
Existe uma maneira de enfileirar todas as solicitações HTTP dos clientes (para que sua conexão HTTP seja mantida e não interrompida) enquanto desligamos o Java Application Server (ou qualquer outro contêiner...) com nosso aplicativo. A manutenção leva menos de 60 segundos, então a ideia é apenas implantarmos uma nova versão do aplicativo e depois dizermos "permitir o tráfego de volta para o aplicativo da web novamente", para que os clientes sofram um atraso, mas não uma queda nas conexões - como o solicitações enfileiradas não terão permissão para chegar ao nosso aplicativo.
Para ser mais claro, não estamos lidando aqui com um site, mas na verdade são solicitações de API feitas por HTTP, e os clientes estão na verdade usando bibliotecas de código que suportam o atraso especificado - para que os clientes saibam que devem esperar (enquanto fazemos A manutenção).
Você tem alguma ideia? Se necessário, podemos desenvolver um pequeno aplicativo para isso se não houver uma solução óbvia/pronta para uso, embora este seja um problema muito comum enfrentado basicamente por qualquer pessoa que fornece uma API HTTP para seus clientes.
Responder1
Que tal o seguinte tipo de princípio? Digamos que seja mod_proxy, certifique-se de que ProxyTimeout e ProxyPass connectiontimeout= (e provavelmente retry=) sejam pelo menos o tempo de manutenção ou o tempo limite de inatividade do cliente API.
Então, antes da manutenção, faça firewall em todas as novas conexões no backend, por exemplo iptables -I INPUT -p tcp --syn --dport 8080 -j DROP
. Após a manutenção, remova a regra com iptables -D
.
MaxClients possivelmente poderia permanecer baixo, mas você pode querer aumentar ListenBackLog
se o tempo limite da conexão TCP no cliente for curto.
Responder2
Basta iniciar a nova versão do aplicativo em sua própria instância (ou seja, em uma porta diferente) e atualizar a configuração do proxy reverso para redirecionar as solicitações para a nova instância, o que pode ser feito sem tempo de inatividade. ( apachectl reload
)
Em seguida, desative a versão antiga e a instância, liberando recursos.