Volver al blog

Síguenos y suscríbete

Almacenamiento en caché de la API, parte I

La web ha recorrido un largo camino desde los años 90. En el pasado, los sitios se impulsaban por una aplicación única y monolítica que actuaba como el único medio de comunicación hacia una base de datos centralizada. En el enfoque moderno se divide esta gran aplicación en un conjunto de servicios interdependientes y cooperativos.

El método estándar de comunicación entre estos servicios es la interfaz de programación de aplicaciones (API). Las API son a menudo responsables no solo de capturar sino también de mutar datos; por lo tanto, pueden ser muy dinámicas y notablemente difíciles de acelerar. Almacenando tu API en caché, sin embargo, puedes reducir la latencia, optimizar el rendimiento de tu sitio web y ampliarlo de forma más eficaz.

Aquí es donde Fastly entra en acción. En este artículo, vamos a adentrarnos en los principios básicos de uso de Instant Purge, nuestra función de purga instantánea para el almacenamiento en caché de la API.

Un ejemplo: construcción de una API de comentarios de artículos

Para empezar, imaginemos una revista en línea que contiene artículos y permite a los usuarios escribir comentarios. A partir de esta descripción básica, es bastante fácil imaginar un esquema relacional para la base de datos de dicha página web:

En la figura anterior vemos que cada artículo puede tener muchos comentarios y que cada comentario tiene como autor a un usuario único.

Puedes diseñar una especificación RESTful en la API y usarla para manipular y extraer comentarios de la siguiente manera:

  • GET /comment - Obtener una lista de todos los comentarios

  • GET /comment/:id - Mostrar un comentario con el identificador indicado

  • POST /comment - Crear un nuevo comentario

  • PUT /comment/:id - Actualizar un comentario con el identificador indicado

  • DELETE /comment/:id - Eliminar un comentario con el identificador indicado

Los métodos de creación, lectura, actualización y eliminación (CRUD, por sus siglas en inglés) garantizan que la API puede ejecutar sus operaciones básicas, pero no exponen el aspecto relacional de los datos. Para ello, puedes añadir un par de puntos de conexión relacionales como el siguiente:

  • GET /article/:article_id/comments - Obtener una lista con los comentarios de un artículo concreto

  • GET /user/:user_id/comments - Obtener todos los comentarios de un usuario determinado

Puntos de conexión como estos facilitan a otros programadores conseguir la información que necesitan para realizar tareas como presentar la página HTML de un artículo o mostrar los comentarios en la página de perfil de un usuario.

Aunque hay muchos otros puntos de conexión que podríamos construir para esta API, el conjunto de los siete que hemos definido anteriormente debería bastar para nuestros propósitos. Como nota final, supongamos que la API ha sido programada para usar un modelo de relación de objetos (ORM, por sus siglas en inglés), como ActiveRecord, cuando interactúa con la base de datos.

Almacenar en caché la API de comentarios

Utilizar Fastly para almacenar en caché web nuestra API de comentarios es muy fácil. Para ello, seguiremos este plan básico de ataque:

  1. Determinar los puntos de conexión de la API que se pueden almacenar en caché web.

  2. Enviar una solicitud de invalidación PURGE a Fastly cuando los datos cambien.

  3. Establecer la configuración de Fastly, la implementación y el CNAME del dominio de la API.

Paso 1: determinar los puntos de conexión de la API que se almacenarán en caché

Para almacenar la API en caché, primero necesitamos identificar qué direcciones URL queremos almacenar en caché. Una forma sencilla de hacerlo es distribuir los puntos de conexión de especificación en dos grupos.

El primer grupo, al que llamaremos "accesores", se utiliza para recuperar datos de lo comentarios o acceder a ellos. Estos son los puntos de conexión que queremos almacenar en caché utilizando Fastly. En referencia a nuestra especificación, vemos que cuatro puntos de conexión se ajustan a esta descripción:

  • GET /comment
  • GET /comment/:id
  • GET /article/:article_id/comments
  • GET /user/:user_id/comments

El segundo grupo, al que llamaremos "mutadores", se utiliza para cambiar o modificar los datos de los comentarios. Estos puntos de conexión se consideran “no cacheables” ya que siempre son dinámicos. Vemos que tres de nuestros puntos de conexión encajan en esta descripción:

  • POST /comment
  • PUT /comment/:id
  • DELETE /comment/:id

En una anotación rápida de los métodos HTTP para cada uno de los puntos de conexión, deberías comenzar a ver un patrón. Como elegimos hacer una API de comentarios RESTful, podemos identificar fácilmente qué puntos de conexión son "accesores" y cuáles "mutadores" siguiendo una regla simple:

Los puntos de conexión GET pueden ser almacenados en caché, pero los puntos de conexión 3PUT,POST y DELETE, no.

Una vez que hayamos recopilado esta información, estamos listos para programar la API y que envíe solicitudes Instant Purge.

Paso 2: enviar solicitudes PURGE

Aunque puede ser tentador señalar los puntos finales PUT, POST y DELETE como el lugar en el que los datos están siendo modificados, esto no suele mostrar el proceso en conjunto. En la mayoría de las API modernas, se cree que estos puntos de conexión representan una interfaz con el código modelo responsable de controlar las modificaciones de la base de datos.

En el ejemplo de especificación para la API hemos asumido que estábamos usando un ORM para realizar el trabajo de la base de datos. La mayoría de ORM permiten a los programadores establecer “callbacks”, o devoluciones de llamada, especiales en modelos que se activarán cuando se hayan realizado acciones determinadas (por ejemplo, antes o después de una validación o tras crear un nuevo registro).

Para la purga, nos interesa saber si un modelo ha guardado la información en la base de datos (ya sea un nuevo registro, una actualización de un registro existente o la eliminación de un registro). En este punto, añadiríamos una "callback" que indicase a la API que debe enviar una solicitud PURGE a Fastly para cada uno de los puntos de conexión almacenables en caché que hemos identificado anteriormente.

Para un modelo de comentarios ActiveRecord es tan simple como esto:

require 'fastly'
    
class Comment < ActiveRecord::Base
  fastly = Fastly.new(api_key: 'MY_API_KEY')
    
  after_save do
    fastly.purge "/comment"
    fastly.purge "/comment/#{self.id}"
    fastly.purge "/article/#{self.article_id}/comments"
    fastly.purge "/user/#{self.user_id}/comments"
  end
end

Con nuestro código modelo en su lugar, la API ya está lista para almacenarse en caché. El último paso es configurar el servicio Fastly para nuestra API.

Paso 3: establecer la configuración de Fastly

Configurar un servicio para manejar la API de comentarios es un momento. Como acción predeterminada, Fastly no almacena en caché las solicitudes PUT, POST y DELETE (para más información al respecto, consulta nuestro artículo sobre comportamiento predeterminado del almacenamiento en caché web para los verbos HTTP). Esto significa que lo único que necesitamos en nuestra configuración es lo siguiente:

  • El dominio de la API

  • La dirección del servidor back-end que ejecuta el software de la API

En serio, esto es todo lo que necesitas. Por supuesto, siempre puedes proporcionar reglas adicionales que le indiquen a Fastly cómo proceder sobre algunos de los aspectos más peculiares de tu API (todas los tienen, ¿verdad?).

Una vez completada la configuración, solo falta activarla y, a continuación, realizar el CNAME del dominio dado para apuntar a Fastly. En este punto, la API se almacenará en caché en producción y ¡será más rápida que nunca!

(Para más detalles sobre cómo configurar Fastly para tus sitios web y API, consulta nuestra documentación).

Esto solo es el comienzo…

El almacenamiento en caché web de la API a través de Fastly es una forma muy efectiva de acelerar el rendimiento de tu arquitectura orientada a servicios. Este es el motivo por el que compañías como New Relic y Wanelo nos utilizan para acelerar sus llamadas a sus respectivas API y mantener satisfechos a sus clientes.

Tal y como hemos demostrado en este tutorial, el proceso es muy sencillo. Una vez que hayas determinado qué se debe almacenar en caché y hayas programado la API para enviar las solicitudes Instant Purge en los lugares correctos, Fastly se encargará del resto.

El almacenamiento en caché de Instant Purge puede aplicarse prácticamente a cualquier API, pero hay un buen número de características avanzadas que pueden hacerlo aún más fácil. Sigue con atención la segunda parte de nuestra serie sobre el almacenamiento en caché de la API, donde abarcamos el uso de encabezados Surrogate-Key y Cache-Control desde la perspectiva de la API.

Leer más:parte II y parte III