Actualmente las aplicaciones web requieren decenas de consultas SQL para generar una sola página (por ejemplo en el caso de los gestores de contenido). Esto se convierte en el cuello de botella más común en las webs de millones de páginas vista. En estos casos podemos utilizar varias estrategias de cache, por ejemplo el uso de memcached y/o el uso de reverse proxies como Nginx, Perlbal, Squid and Varnish. La elección de uno u otro dependerá de cada proyecto, pero en este post hablaré sobre Varnish Cache, el cual he usado con éxito en varios proyectos.

Historia

Varnish fue creado por el periódico noruego Verdens Gang (VG). El diseño y desarrollo inicial fue realizado por el consultor danés Poul-Henning Kamp y actualmente, el desarrollo, está gestionado por la consultora noruega Linpro.

Varnish tiene licencia de código abierto (en concreto licencia FreeBSD), pero existe soporte comercial por parte de Linpro y otros.

Arquitectura

Quizás lo más destacable de Varnish es que desde el principio se diseño y programó teniendo en cuenta los sistemas operativos modernos, resumiendo, es un programa moderno.

Varnish almacena los datos en la memoria virtual y deja la tarea de decidir lo que se almacena en la memoria y lo que se guarda en el disco al sistema operativo. Esto ayuda a evitar la situación en la que el sistema operativo comienza a copiar datos al disco cuando la aplicación esta haciendo lo mismo.

Una característica significativa de Varnish es que cada conexión cliente se asigna a un subproceso  independiente. Cuando se alcanza el límite configurado en el número de subprocesos activos, las conexiones entrantes se colocan en cola y sólo cuando esta cola alcanza su límite configurado será rechazado las conexiones entrantes.

Con el fin de reducir el número de llamadas al sistema a un mínimo, los datos de registro o logs se almacenan en la memoria compartida, y la tarea de escribir los registros en el disco se delega a una aplicación separada.

Características

Podemos destacar las siguientes características de Varnish:

  • Diseño moderno
  • VCL, es un lenguaje de configuración que permite una gran flexibilidad y adaptación. Incluso es posible añadir código C con lo que es posible expandir Varnish sin modificar el código fuente.
  • Load balancing
  • Soporte parcial de ESI
  • Web GUI (Beta), muy útil en caso de configuraciones en cluster
  • Posibilidad de cambiar configuraciones sobre la marcha
  • Reescritura y redireccionamiento de url (no es necesario un programa externo)
  • Consulta de estadísticas y logs en tiempo real

Rendimiento

Como ya he comentado anteriormente, el rendimiento de Varnish y otros reverse proxies (como por ejemplo Squid) depende de múltiples factores y la configuración que se utilice, por lo que siempre es recomendable analizar cada situación y decidirse por una aplicación u otra. Por ejemplo en este post podemos ver una comparación entre Squid y Varnish.

Ejemplos reales

Estas son algunas webs de alto tráfico  que utilizan Varnish

Por último, en uno de mis proyectos, el cliente quería separar completamente de Internet el acceso a su gestor de contenidos, pero mantener una web actualizada al segundo y con posibilidades de disponer de servidores distribuidos en Europa y América. Con estos requisitos, implementamos Varnish en los servidores públicos del cliente cacheando el servidor de contenido que se encontraba en la red privada del cliente. Gracias a esta arquitectura, los visitantes de la web solo acceden al servidor de Varnish, con lo que no tienen acceso a otros servicios como por ejemplo php, mysql o ssh. A su vez, el usuario final visualiza las páginas en menor tiempo al cargarlas desde Varnish.