Ya has visto que el código y la base de datos gastan CPU. Ahora toca lo que sale del servidor: las respuestas. Cada byte que envía tu API se genera, se transmite y se interpreta al otro lado, y en una API con millones de llamadas, unos kilobytes de más se convierten en terabytes al año. Esta unidad trata de cómo enviar lo justo y cómo elegir el protocolo adecuado.
1 // Cada byte, tres veces
Un byte de más en una respuesta no se paga una vez, sino en tres sitios:
- En el servidor: hay que obtener el dato, convertirlo a JSON (serializar) y comprimirlo.
- En la red: hay que transmitirlo. Recuerda del módulo 2 que los modelos reparten el consumo de la red en proporción a los datos, y que a largo plazo más tráfico significa más infraestructura.
- En el cliente: hay que descomprimirlo, interpretarlo (deserializar) y guardarlo en memoria, a menudo en un móvil con batería.
Y hay un cuarto coste que no es energético: el tiempo de espera, que en conexiones móviles lentas o con tarifas de datos limitadas afecta de verdad a los usuarios.
2 // Adelgazar las respuestas
Hay cuatro formas de reducir un payload, y se pueden combinar:
Enviar sólo los campos necesarios. Es muy habitual que una API devuelva el objeto completo de la base de datos, con treinta campos, cuando la pantalla que la consume sólo muestra tres. Soluciones: crear respuestas específicas (DTO) para cada uso, permitir que el cliente elija los campos con un parámetro como ?fields=id,nombre,precio, o usar GraphQL, cuyo punto fuerte es precisamente pedir sólo lo que se necesita.
Enviar sólo los elementos necesarios. Una lista de 5.000 productos cuando se muestran 20 es un derroche. La paginación, que tratarás desde el lado del frontend en el módulo 4, empieza aquí.
Comprimir. Los servidores web y los frameworks pueden comprimir las respuestas con gzip o Brotli si el cliente lo admite. En texto como JSON o HTML, la reducción suele ser enorme.
Elegir un formato más compacto. JSON es legible y universal, pero repite los nombres de los campos en cada objeto. Los formatos binarios como Protocol Buffers no envían nombres, sólo números de campo y valores codificados de forma compacta.
Una API de un comercio responde 2 millones de veces al día con un listado de productos. La respuesta original pesa 40 kB. El equipo aplica dos cambios: devolver sólo los 5 campos que usa la app (la respuesta pasa a 12 kB) y activar la compresión (se queda en unos 3 kB).
- Antes: 40 kB × 2.000.000 = 80.000.000 kB = 80 GB al día.
- Después: 3 kB × 2.000.000 = 6.000.000 kB = 6 GB al día.
- En un año: de unos 29 TB a unos 2,2 TB.
Comprimir no siempre compensa. Las imágenes, vídeos y ficheros ya comprimidos (JPEG, WebP, ZIP) apenas se reducen, y comprimirlos otra vez sólo gasta CPU. Tampoco merece la pena con respuestas muy pequeñas, de unos pocos cientos de bytes. Configura la compresión para los tipos de contenido de texto.
3 // Conexiones: menos saludos, más datos
Antes de enviar un solo byte útil, cliente y servidor tienen que establecer la conexión: el saludo de TCP y la negociación de cifrado TLS. Si cada petición abre una conexión nueva, ese trabajo se repite una y otra vez.
- HTTP/1.1 ya permite reutilizar conexiones (keep-alive), pero atiende las peticiones de una en una por conexión, y los navegadores abren varias en paralelo.
- HTTP/2 permite enviar muchas peticiones a la vez por una sola conexión (multiplexación) y comprime las cabeceras, que en APIs con muchas llamadas pequeñas pueden pesar tanto como el propio contenido.
- HTTP/3 hace lo mismo sobre QUIC, un transporte basado en UDP que se recupera mejor en redes móviles con pérdidas.
En el lado del servidor, lo equivalente es usar pools de conexiones a la base de datos y a otros servicios, en lugar de abrir y cerrar una conexión en cada petición.
4 // REST frente a gRPC
REST con JSON es el estándar de facto de las APIs web: legible, fácil de probar con el navegador o con curl, y entendido por cualquier lenguaje.
gRPC es un framework de llamadas remotas creado por Google. Usa Protocol Buffers como formato y HTTP/2 como transporte, y define la API en un contrato (un fichero .proto) a partir del cual se genera el código de cliente y servidor.
| Criterio | REST + JSON | gRPC + Protocol Buffers |
|---|---|---|
| Tamaño de los mensajes | Mayor, aunque se reduce mucho comprimiendo | Menor, binario y compacto |
| Coste de serializar | Mayor, hay que generar y analizar texto | Menor |
| Uso desde el navegador | Directo | Necesita una capa intermedia (gRPC-Web) |
| Depuración | Legible a simple vista | Binario, requiere herramientas |
| Streaming | Limitado | Integrado, en ambos sentidos |
| Contrato | Opcional (OpenAPI) | Obligatorio y tipado |
La conclusión práctica: gRPC brilla en la comunicación interna entre microservicios, donde hay muchísimas llamadas, ambos extremos los controla el mismo equipo y nadie necesita leer los mensajes a mano. Para una API pública o una que consume directamente el navegador, REST con respuestas ajustadas y comprimidas suele ser la opción más razonable.
Antes de cambiar de protocolo, adelgaza lo que envías: quita campos, pagina y comprime. Esos cambios dan la mayor parte del ahorro con poco esfuerzo. gRPC es el siguiente paso cuando el volumen de llamadas entre servicios lo justifica.
Autoevaluación
¿Por qué reducir el tamaño de las respuestas de una API ahorra energía en más de un sitio?
¿Por qué JSON comprime tan bien con gzip o Brotli?
Si gRPC es más eficiente, ¿por qué no sustituir todas las APIs REST por gRPC?
.proto. Para una API pública que consume un navegador, REST con JSON comprimido suele ser suficiente.