04 Oct 24

Flujo de procesamiento en VCL

El Varnish Configuration Language (VCL) es el corazón de Varnish, uno de los servidores de caché HTTP más potentes y flexibles del mundo. Este lenguaje específico de dominio permite personalizar la manera en que gestionas  las solicitudes, empleas la memoria caché y optimizas la interacción entre el servidor de origen y el cliente. 

Si quieres adquirir habilidades con este lenguaje, lo primero es comprender su lógica y la forma en que se ejecuta.

Lenguaje con enfoque granular y dinámico

Comprender el ciclo de procesamiento en VCL es fundamental para aprovechar al máximo las capacidades de Varnish. Ciertamente es el primer paso para diseñar reglas avanzadas que mejoren la eficiencia de tu infraestructura web.

Gracias al enfoque granular de este lenguaje podrás intervenir en momentos clave y ajustar así la lógica de caché para garantizar que tu aplicación web o API funcione de manera óptima.

VCL permite escribir una serie de subrutinas que se invocan en diferentes etapas del ciclo de vida de la solicitud. 

Una de las características más poderosas y versátiles es su capacidad de reescribir dinámicamente solicitudes y respuestas, permitiendo que se activen  las subrutinas únicamente cuando es relevante para la solicitud en curso. 

Comprendiendo la lógica de procesamiento del VCL

En lugar de ejecutar tu código de manera secuencial, como en otros lenguajes de programación, el código VCL se activa en diferentes fases de la solicitud, proporcionando un control fino sobre cómo se manejan las peticiones y respuestas dentro del servidor. 

Y, a diferencia de otros lenguajes, VCL no se ejecuta de forma independiente, sino que sus instrucciones son procesadas en momentos específicos del ciclo de vida de una solicitud HTTP. De esta forma podrás controlar a nivel detallado qué entra y qué sale de tu caché

esquema flujo VCL

Estas fases incluyen, principalmente:

vcl_recv: esta es la primera etapa que se activa cuando Varnish recibe una solicitud desde un cliente. Aquí puedes decidir si la solicitud debe ser servida desde la caché o si debe pasar al servidor de origen. Es también el lugar ideal para realizar validaciones iniciales y reescribir URLs, aplicar políticas de autenticación o redirigir solicitudes a otros servidores.

Por ejemplo para determinar qué servidor backend manejará la solicitud basado en el dominio de la solicitud original:

sub vcl_recv {
    if (req.http.Host == "mi-sitio.com") {
        set req.backend_hint = backend1;
    } else {
        set req.backend_hint = backend2;
    }
}

vcl_backend_response: Cuando una solicitud no puede ser servida desde la caché y se envía al servidor de origen, esta subrutina maneja la respuesta del servidor antes de ser almacenada en la caché. Aquí puedes decidir si deseas almacenar la respuesta o simplemente entregarla al cliente sin almacenarla.

Este fragmento verifica si la respuesta desde el backend tiene la cabecera Cache-Control configurada como privada. Si es así, se entrega directamente al cliente sin almacenarse en caché:

sub vcl_backend_response {
    if (beresp.http.Cache-Control ~ "private") {
        return (deliver);
    } # Se cachea por defecto.
}

vcl_deliver: el paso final donde se envía la respuesta al cliente. Aquí puedes modificar las cabeceras de la respuesta o registrar información sobre la solicitud. Por ejemplo, puedes agregar cabeceras personalizadas para realizar un seguimiento del tiempo de respuesta o el estado de la caché.

Este sería un ejemplo de cómo agregar una cabecera X-Cache a la respuesta que indica si la solicitud fue servida desde la caché (HIT) o si tuvo que obtenerse desde el backend (MISS).:

sub vcl_deliver {
  set resp.http.X-Cache = "MISS";
  if( obj.hits >0 ) {
    set resp.http.X-Cache = "HIT";
}

Tip básico: Es importante recordar que, aunque VCL tiene similitudes con otros lenguajes de programación (como las estructuras condicionales y las subrutinas), en última instancia, estás configurando el comportamiento de un servidor de caché, por lo que cada decisión que tomes impactará directamente en el rendimiento y la latencia de tu aplicación.

Optimiza el manejo de logs y monitoreo en Varnish

Varnish no escribe archivos de registro por defecto debido a razones de rendimiento, sino que utiliza un búfer circular en memoria. Para mejorar tu capacidad de diagnóstico y monitoreo, debes familiarizarte con herramientas como varnishlog, varnishncsa y varnishstat, que te permitirán analizar la información en tiempo real sobre las solicitudes y respuestas. Esto te ayudará a identificar cuellos de botella y optimizar tus políticas de cacheo con mayor precisión.

Cómo avanzar en conocimiento de VCL

Varnish es una tecnología muy extendida y existen numerosos recursos para mejorar tus conocimientos de VCL. Algunos de los que te sugerimos son:

  • Webinars y tutoriales en la web de Varnish: La página oficial de Varnish ofrece una amplia variedad de webinars y tutoriales que pueden ayudarte a profundizar en las mejores prácticas y funcionalidades avanzadas de VCL.
  • Documentación oficial: El manual de Varnish es una excelente fuente de referencia. Dedica tiempo a explorar las secciones dedicadas a la optimización del caché para comprender cómo aplicar VCL en proyectos complejos.
  • También puedes consultar The Varnish Book, que proporciona una guía detallada para usuarios de todos los niveles, ayudándote a dominar los fundamentos sin una curva de aprendizaje pronunciada.
  • Foros y comunidades: Unirte a foros como el de Varnish Cache o participar en comunidades como Stack Overflow te permitirá resolver dudas puntuales y aprender de la experiencia de otros desarrolladores.

Desarrollar y mejorar tus habilidades en VCL no solo te permitirá aprovechar al máximo la potencia de Varnish, sino también te dará una ventaja competitiva al gestionar tus aplicaciones en el edge con precisión y eficiencia.