Módulo 03 // Unidad 03

Protocolos y payloads eficientes

Enviar sólo lo necesario, comprimido y en el formato adecuado

Unidad para alumnos del curso

Comprobando tu sesión…

Inicia sesión con la cuenta de Google con la que estás matriculado para ver esta unidad.

Esa cuenta no tiene acceso a este curso. Prueba con otra.

No se ha podido cargar el inicio de sesión de Google. Comprueba la conexión o si algún bloqueador lo impide, y recarga la página.

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:

  1. En el servidor: hay que obtener el dato, convertirlo a JSON (serializar) y comprimirlo.
  2. 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.
  3. 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.

LA MISMA RESPUESTA, CUATRO TAMAÑOS (ILUSTRATIVO) JSON completo 30 campos por producto 40 kB JSON ajustado sólo 5 campos 12 kB JSON ajustado + gzip comprimido 3 kB Protobuf + compresión binario, sin nombres 2 kB quitar campos: −70 % · comprimir: −75 % adicional · binario: un poco más
El mismo listado de productos en cuatro versiones, con tamaños ilustrativos. Fíjate en que el mayor salto lo dan quitar campos y comprimir; el formato binario añade una mejora menor encima.

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).

  1. Antes: 40 kB × 2.000.000 = 80.000.000 kB = 80 GB al día.
  2. Después: 3 kB × 2.000.000 = 6.000.000 kB = 6 GB al día.
  3. En un año: de unos 29 TB a unos 2,2 TB.
Dos cambios sencillos reducen la transferencia en más de un 90 %. La compresión cuesta algo de CPU en el servidor, pero en respuestas de texto como esta el ahorro de red lo compensa con creces.

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?
Porque cada byte se procesa en el servidor, viaja por la red y se procesa en el cliente. Un payload más pequeño se serializa, se comprime, se transmite y se deserializa con menos trabajo en los tres puntos, y además llega antes, sobre todo en conexiones móviles.
¿Por qué JSON comprime tan bien con gzip o Brotli?
Porque es texto muy repetitivo. Los nombres de los campos se repiten en cada objeto de una lista, y los compresores sustituyen esas repeticiones por referencias cortas. Por eso es habitual que una respuesta JSON grande se quede en una pequeña fracción de su tamaño original.
Si gRPC es más eficiente, ¿por qué no sustituir todas las APIs REST por gRPC?
Porque su ventaja está en la comunicación entre servicios, y tiene costes en otros contextos. Los navegadores no hablan gRPC de forma nativa y necesitan una capa intermedia; el formato binario es más difícil de depurar; y exige mantener contratos .proto. Para una API pública que consume un navegador, REST con JSON comprimido suele ser suficiente.