asp.net - Evita que el paquete responda si el destructor de caché no coincide con el contenido
asp.net-mvc caching (1)
Estoy usando Bundling y Minification en una granja de servidores donde hay un período de intercambio de servidores antiguos y nuevos.
El problema que tengo es que los servidores antiguos almacenan en caché el contenido de la nueva URL del destructor de caché de paquetes.
Por ejemplo, el nuevo HTML se almacena en caché con la nueva URL del paquete:
<script src="/bundle.css?v=RBgbF6A6cUEuJSPaiaHhywGqT7eH1aP8JvAYFgKh"></script>
Esto luego hace una solicitud a un servidor antiguo que aún no se ha actualizado con el nuevo código CSS y luego se almacena en caché.
Cualquier llamada posterior a la nueva URL del paquete devolverá el código anterior.
Por lo tanto, ¿hay alguna forma de verificar que el contenido del paquete coincida con el destructor de caché hash? Y si no lanza un 404 por ejemplo.
Utilizando mi ejemplo anterior, cuando la solicitud vuelve al antiguo servidor del paquete, verificará el contenido del paquete, generará un hash de contenido y lo comparará con la cadena de consulta.
En este caso, el eliminador de caché no coincidiría con el hash de contenido real y se devolvería un 404.
Finalmente, un usuario accedería a un nuevo servidor con la solicitud del paquete y el contenido correcto se almacenaría en la memoria caché.
Es probable que nos encontremos con el mismo problema pronto, pero nos hemos limitado a solo 2 dominios de actualización (dividimos los servidores a la mitad para que no haya más de una versión ejecutándose a la vez).
Por lo que veo, hay 4 alternativas posibles:
- Haga que su contenido estático siempre apunte a un servidor actualizado. Esto podría hacerse (dependiendo de su configuración) por dirección IP o utilizando una URL que sepa que ya se ha actualizado (si tiene un servidor que se actualiza primero).
- Configure su equilibrador de carga para que las solicitudes de la misma dirección IP terminen en el mismo sistema (si su contenido estático se sirve desde sus servidores de aplicaciones). Si esto no se puede hacer a nivel de equilibrador de carga, puede hacerlo más adelante configurando diferentes direcciones IP para diferentes entornos y luego intercambiando sus registros DNS.
- Implemente un controlador en ASP.NET que escuche los archivos CSS y verifique si el hash del paquete es lo que se esperaba. Probablemente necesitará un objeto Singleton para almacenarlos cuando se generan cuando se carga su aplicación. Esto puede devolver un 404, 301 (para que lo vuelvan a intentar) o devolver la versión anterior pero indicarle que no almacene en caché los resultados. Tenga en cuenta que con HttpPipelining no es probable que llegue a un servidor diferente, por lo que una redirección podría no ayudar.
- Tenga una marca de configuración que se establezca mientras realiza una implementación que cambia todas las URL de almacenamiento de caché para que sean la fecha actual. Esto deshabilitará todo el almacenamiento en caché hasta que se complete su implementación, lo que significa que no se conservarán los activos "incorrectos" entregados.
¿Es este un problema que realmente estás viendo, o es hipotético? A menos que su sitio tenga mucho tráfico y sus implementaciones demoren unos minutos, no es algo que pueda ver. Tendrá que tener cuidado de no devolver los 404, ya que a veces la hoja de estilo incorrecta es mejor que ninguna hoja de estilo.