Mejorar el rendimiento en Drupal con Quicklink 2.0

Juraría que había hecho un post hablando sobre el módulo Quicklink cuando salió en 2019, pero no lo he encontrado.

El artículo de hoy es en referencia a la publicación que recientemente ha hecho el equipo de Lullabot (los mantenedores del módulo): https://www.lullabot.com/articles/improve-your-sites-experience-quicklink-20

¿Realmente mejora el rendimiento?

Este módulo, de forma simplificada, lo que hace es precalentar las caches.

En la primera versión del módulo, su forma de funcionamiento tenía problemas graves y afectaba negativamente al rendimiento del servidor.

Era un módulo que yo no recomendaba, sobre todo desde que un cliente me contrató para un análisis de rendimiento de un Drupal y donde detecté que el problema principal era el módulo Quicklink + Webform.

Para entender porque NO lo recomiendo para cualquier web, y que porqué no es un módulo de "solo instalar y no configurar" he de explicar un par de cosas antes.

¿Qué hace y cómo funciona?

Por ejemplo, cuando un usuario entra en la Home de tu web este módulo se encarga de precargar de forma asíncrona las páginas que tienen los links de la Home.

A medida que el usuario hace scroll en la home, se irán haciendo peticiones a los links de tu mismo dominio. Esto significa que solo se precargan los enlaces que el usuario ve actualmente en la pantalla.

Supongamos que tienes una típica web donde en tu Home tienes un menú en la cabecera con cuatro enlaces (los típicos "Quiénes Somos", "Servicios", "Contacto", "Precios", ...) y que debajo del menú tienes un texto con algún otro enlace, un par de banners, un listado de categorías y al final de la página tienes un listado con los últimos artículos del blog.

El módulo Quicklink cargará los enlaces de arriba hacia abajo. Por tanto supongamos que sin hacer scroll lo que ve el usuario en su pantalla es el menú, el texto y un par de banners. Todos estos enlaces se pre-cargarán sin que el usuario lo note, y luego pre-cargará el resto de enlaces en el momento en que el usuario haga scroll y en su pantalla aparezca el listado de categorías o el listado de artículos del blog.

Hasta aquí parece buena idea esta implementación, y teóricamente se debería notar un aumento en la velocidad de carga, o al menos es lo que debería notar el usuario al tener las caches pre-calentadas (o las páginas pre-cargadas o como lo quieras llamar).

Caso en la vida real

En muchas webs hay almenos una página que es un agujero negro en lo referente al rendimiento. Las típicas son los formularios con algún sistema anti captcha que deshabilitan las cachés (por ejemplo el formulario de registro o páginas de contacto implementadas con el módulo webform) o listados hechos con views que por algún motivo no conviene tener en cache (search_api + facets, listados con orden aleatorio, o listados que son únicos para cada usuario).

En resumidas cuentas, Quicklink carga páginas que son agujeros negros en lo referente al rendimiento. Y el mayor problema es que normalmente son páginas con pocos acceso por parte de los usuarios, pero que Quicklink hace que se carguen siempre.

Imaginemos que tenemos 1000 visitas a nuestra Home, y que de todos esos usuarios solo 10 van a la página de contacto. Inicialmente solo esas 10 personas van a tener que cargar el formulario de contacto (webform + captcha) y por tanto solo hemos invalidado las caches de esas 10 páginas. El restante de las 990 visitas, apenas 500 siguen navegando por la web, el remanente solo es gente que ve la Home y hace rebote al dejar de navegar porque no le interesa lo que ve.

En este punto tenemos 1000 visitas de la home + 500 visitas a otras páginas + 10 visitas sin caché.

Ahora supongamos que instalamos Quicklink. Por defecto tendríamos 1000 visitas multiplicado por el número de enlaces visibles en la pantalla del usuario. Para hacer números redondos supongamos que solo hay 10 enlaces visibles (entre los cuales tenemos el de la página de contacto).

Entonces tenemos 1000 X 10 = 10.000 solicitudes al servidor, de las cuales 1000 son a la página de contacto la cual invalida las caches porque tiene un captcha para evitar los envíos de Spam de bots.

Y a esto se le suma que si tenemos 500 usuarios que acaban yendo a otra página entonces tenemos 500 x 10 = 5000

Comparativa:

  • Sin Quicklink: 1510 peticiones al servidor. Solo 10 peticiones lentas.
  • Con Quicklink: 10.000 + 5000 + 00 = 15.010 peticiones de las cuales 1000+500 son peticiones inútiles a la página de contacto

Creo que queda claro que estamos saturando el servidor. Y si no te queda claro entonces te aseguro que se nota en la CPU y que te puede tumbar la web en el momento que tienes muchas visitas, ya que es un efecto multiplicador.

Por ese motivo no recomiendo instalar el módulo Quicklink a menos que sepas lo que estás haciendo.

Y por cierto, si tienes una web con varios idiomas entonces estos números son peores, ya que en todas las páginas tendrás enlaces a varias urls (sus traducciones) y normalmente los usuarios no cambian de idioma si han llegado desde Google.

¿Para quién puede serle útil Quicklink?

O para webs pequeñas con muy pocas visitas, o para webs que tienen un equipo que sabe muy bien lo que hace y qué páginas se han de excluir.

Quicklink no es una solución mágica para hacer que la web vaya más rápida. Todo lo contrario, puede afectar negativamente al servidor y ralentizar todo el sistema.

Configuraciones a tener en cuenta

Todo esto que he comentado arriba es si no configuras correctamente el módulo, o si no usas la v2.

Por lo que veo, en la v2 que acaban de sacar puedes configurar qué enlaces quieres ignorar para que no se precarguen.

  • Puedes ignorar rutas, por ejemplo "/contacto"
  • O ignorar selectores css, por ejemplo para ignorar todos los enlaces del menú del header o del footer o el selector de idiomas.

También en la V2 ahora puedes configurar un límite y un tiempo de espera. Y esto es de mucha utilidad para evitar sobrecargar el servidor con muchas peticiones inútiles.

En cualquier caso, Quicklink es un módulo potente que en determinados proyectos puede ser muy útil. Pero no es un módulo que se pueda recomendar a gente inexperta para "mejorar el rendimiento de forma mágica y sin esfuerzo".

¿Tienes algún proyecto en mente?

Si quieres hacer algo en Drupal tal vez puedas contratarme.

Ya sea para consultoría, desarrollo o mantenimiento de sitios web Drupal.