EEEugenio Estrada

La tiranía de la red: latencia física y las falacias de la computación distribuida

Sistemas DistribuidosRendimientoRedesArquitectura
Escuchar artículo
💡

La red no es invisible

  • Límites físicos insuperables: La velocidad de la luz en la fibra de vidrio es aproximadamente un 30% más lenta que en el vacío, imponiendo una latencia mínima infranqueable.
  • El impuesto de serialización: Traducir estructuras de datos a formatos textuales como JSON consume CPU y añade una latencia significativa comparado con protocolos binarios.
  • El antipatrón N+1 distribuido: Diseñar APIs conversacionales en microservicios en lugar de transaccionales multiplica exponencialmente el RTT de red.

En el desarrollo local, la red es un concepto casi abstracto. Todo responde en fracciones de milisegundo. Hacemos llamadas locales a bases de datos en contenedores Docker y conectamos servicios mediante sockets locales con la ilusión de que el transporte es gratuito. Sin embargo, en el momento en que nuestro software se despliega en producción —en múltiples zonas de disponibilidad, servidores en la nube o arquitecturas de microservicios— la realidad física reclama su lugar.

La red no es transparente. Tiene costes, límites físicos dictados por la física relativista y una penalización económica en términos de capacidad computacional. Ignorar estas verdades es la causa más común de degradación de rendimiento y fallos catastróficos en sistemas modernos.

El sesgo de la red transparente y las falsas expectativas

En 1994, L. Peter Deutsch y otros ingenieros de Sun Microsystems formularon las famosas falacias de la computación distribuida. La primera de ellas, y la más destructiva, es: “La latencia es cero”.

Cuando un sistema monolítico se descompone en microservicios, las llamadas en memoria a funciones (que tardan nanosegundos) se reemplazan por peticiones de red TCP/IP. Aunque estemos en la misma región de AWS, una llamada de red de ida y vuelta (RTT) rara vez baja de los 1 a 2 milisegundos. Si para resolver una sola transacción de usuario nuestro sistema necesita encadenar secuencialmente cinco llamadas a microservicios independientes, habremos introducido un retraso base de 10 milisegundos de puro tránsito de red, sin contar el procesamiento real del código ni las consultas a la base de datos.

Este fenómeno se agrava drásticamente cuando los microservicios se comunican de forma desordenada o sin un modelo de agregación claro, dando lugar al antipatrón N+1 distribuido. Si para pintar una lista de 50 productos en una interfaz hacemos una llamada HTTP por cada producto para obtener su inventario, estaremos realizando 50 viajes de ida y vuelta por la red. A 2ms por viaje, la latencia agregada será de 100ms sólo en transporte de red, destruyendo la experiencia de usuario.

La física de la fibra óptica: por qué la velocidad de la luz no escala

A menudo se asume que con mejores cables o mayor ancho de banda la latencia tenderá a desaparecer, ignorando los límites físicos ilustrados por los clásicos números de latencia que todo programador debería saber. Esto choca frontalmente con la teoría de la relatividad especial de Einstein.

La velocidad de la luz en el vacío es de aproximadamente (c \approx 299,792 \text{ km/s}). Sin embargo, las señales de red no viajan por el vacío; lo hacen a través de cables de fibra óptica de vidrio. El índice de refracción del vidrio ((n \approx 1.5)) ralentiza la velocidad de propagación de la luz a unas dos terceras partes de su velocidad en el vacío:

[v = \frac{c}{n} \approx 200,000 \text{ km/s}]

Esto significa que, por pura física de materiales, la señal de luz tarda 1 milisegundo por cada 200 kilómetros de cable óptico recorridos.

Si calculamos la distancia geográfica en línea recta entre París y Nueva York (unos 5,800 kilómetros), la distancia real del cableado submarino es considerablemente mayor debido a la geografía marina, estimándose en unos 6,500 kilómetros.

  • El viaje de ida de la señal óptica tardará: (6,500 \text{ km} / 200,000 \text{ km/s} = 32.5\text{ ms}).
  • El viaje de ida y vuelta (RTT) teórico mínimo absoluto es de 65 milisegundos.
  • En la práctica, debido a la congestión de los enrutadores intermedios, switches, amplificadores de señal y la conversión optoelectrónica, el RTT real oscila entre los 75 y 90 milisegundos.

No importa qué procesador utilices, qué framework de moda elijas o cuánto optimices tu código: una petición síncrona entre París y Nueva York tardará al menos 80ms en resolverse debido a las leyes fundamentales de nuestro universo.

El impuesto de la serialización y el coste en CPU

La distancia y los enrutadores no son los únicos culpables de la lentitud de la red. Cada vez que enviamos datos a través de un socket, estos deben convertirse de su representación estructurada en memoria (objetos, grafos) a una corriente secuencial de bytes. Esto es la serialización.

En el desarrollo web moderno, JSON es el rey indiscutible por su legibilidad humana. Pero esta legibilidad tiene un precio computacional altísimo:

  1. Parseo de strings: Convertir números a texto y viceversa (ej. 12345.67 a "12345.67") requiere operaciones de división y formato intensivas en CPU.
  2. Alocación de memoria: Los parsers de JSON suelen generar una gran cantidad de strings y objetos temporales en el montículo (heap), lo que dispara la actividad del recolector de basura (Garbage Collector).

Para sistemas con alta densidad de tráfico o llamadas internas en microservicios, el formato textual de JSON se convierte en un cuello de botella de rendimiento. Aquí es donde protocolos binarios de serialización compacta marcan la diferencia:

Formato Tipo Overhead de CPU Tamaño del Mensaje Soporte de Esquema
JSON Textual Alto Grande (repetitivo) No (dinámico)
Protobuf Binario Muy Bajo Muy Pequeño Sí (estricto)
Avro Binario Bajo Pequeño Sí (dinámico)

Como explica Martin Kleppmann en su libro Designing Data-Intensive Applications, al adoptar gRPC o Protocol Buffers (Protobuf), los datos se codifican en formatos binarios optimizados para el procesador (por ejemplo, usando codificación Varint para enteros), reduciendo drásticamente tanto el uso de CPU como el tamaño de la carga útil de red, lo que disminuye el tiempo de transmisión y enrutamiento.

Estrategias de mitigación pragmáticas

Dado que no podemos cambiar la velocidad de la luz ni eliminar la red, la arquitectura de software debe adaptarse para mitigar sus efectos:

1. APIs agregadas y transaccionales (Batching)

En lugar de interfaces granulares que fuercen al cliente a realizar múltiples peticiones para reunir información, diseña APIs orientadas al caso de uso. El uso de patrones como Backend for Frontend (BFF) o tecnologías como GraphQL/gRPC con soporte de consultas complejas ayuda a consolidar múltiples llamadas de red en una sola.

2. Desacoplamiento asíncrono

La mejor llamada de red es la que no tiene que hacerse de forma síncrona. Si tu sistema puede procesar tareas en segundo plano mediante colas de mensajería (Kafka, RabbitMQ) o eventos, la latencia de la red de cara al usuario final se reduce a cero, ya que la petición inicial se confirma de inmediato y el procesamiento pesado ocurre de forma eventual.

3. Co-localización de servicios

Cuando las llamadas síncronas de baja latencia son críticas, agrupa físicamente los servicios. Utiliza la misma región geográfica e incluso las mismas zonas de disponibilidad (Availability Zones) para los componentes que conversan intensamente entre sí. Si dos servicios tienen un acoplamiento temporal estricto, tal vez deban ser parte del mismo proceso monolítico en lugar de microservicios distribuidos.

Conclusión

El diseño de sistemas distribuidos requiere cambiar de mentalidad: la red debe tratarse como un recurso hostil, limitado e intrínsecamente lento. Optimizar el código interno de una función para ahorrar microsegundos es inútil si a continuación introducimos milisegundos de latencia por un mal diseño de API o una serialización ineficiente. La física del software nos enseña que para construir sistemas robustos y de alto rendimiento, debemos diseñar nuestras arquitecturas respetando la velocidad de la luz.

En este momento...

Leyendo
Profecía: Lecciones sobre el uso y abuso de la predicción, desde los antiguos oráculos hasta la IA

Profecía: Lecciones sobre el uso y abuso de la predicción, desde los antiguos oráculos hasta la IA

Autores Varios

Proyecto Hail Mary

Proyecto Hail Mary

Andy Weir

El infinito placer de las matemáticas

El infinito placer de las matemáticas

Divulgación Matemática

Jugando
Crimson Desert

Crimson Desert

Pearl Abyss