
Tenemos una aplicación web en Java (aunque el lenguaje no es realmente relevante para esta pregunta) y Apache la utiliza a través de un proxy simple.
¿Hay alguna manera de poner en cola todas las solicitudes HTTP de los clientes (para que su conexión HTTP se mantenga y no se interrumpa) mientras apagamos el servidor de aplicaciones Java (o cualquier otro contenedor...) con nuestra aplicación? El mantenimiento demora <60 segundos, por lo que la idea es que simplemente implementemos una nueva versión de la aplicación y luego digamos "permitir el tráfico nuevamente a la aplicación web", para que los clientes experimenten un retraso pero no una caída de las conexiones, como Las solicitudes en cola no podrán llegar a nuestra aplicación.
Para ser más claro, no estamos tratando aquí con un sitio web, sino que en realidad son solicitudes de API realizadas a través de HTTP, y los clientes en realidad están usando bibliotecas de código que admiten el retraso especificado, por lo que los clientes sabrán que deben esperar (mientras hacemos esto). El mantenimiento).
¿Tienes alguna idea? Si es necesario, podemos desarrollar una pequeña aplicación para esto si no existe una solución obvia o lista para usar, aunque este es un problema muy común que experimentan básicamente cualquiera que proporciona una API HTTP a sus clientes.
Respuesta1
¿Qué tal el siguiente tipo de principio? Digamos que es mod_proxy, asegúrese de que ProxyTimeout y ProxyPass Connectiontimeout= (y probablemente retry=) sean al menos el tiempo de mantenimiento o el tiempo de espera de inactividad del cliente API.
Luego, antes del mantenimiento, firewall todas las conexiones nuevas en el backend, por ejemplo iptables -I INPUT -p tcp --syn --dport 8080 -j DROP
. Después del mantenimiento, elimine la regla con iptables -D
.
Es posible que MaxClients permanezca bajo, pero es posible que desee aumentarlo ListenBackLog
si el tiempo de espera de la conexión TCP en el cliente es corto.
Respuesta2
Simplemente inicie la nueva versión de la aplicación en su propia instancia (es decir, en un puerto diferente) y actualice la configuración del proxy inverso para redirigir las solicitudes a la nueva instancia, lo que se puede hacer sin tiempo de inactividad. ( apachectl reload
)
Luego elimine la versión anterior y la instancia para liberar los recursos.