wandres.dev
P2P II · libp2p, iroh y QUIC

Los relevos sin estado y la economía de montar una red entre pares

Un relevo que no guarda estado no tiene base de datos que replicar ni migración que planificar, y esa ausencia cambia por completo la economía de operar una red entre pares frente al servidor de retransmisión clásico.

⏱ 20 min

Toda red entre pares que aspire a funcionar fuera del laboratorio necesita un servidor en algún sitio, y quien diga lo contrario está omitiendo el arranque en frío, la localización de pares y la fracción de usuarios que nunca conseguirá una conexión directa. La pregunta interesante no es si hace falta infraestructura, sino qué se le pide a esa infraestructura, porque de ahí sale todo lo demás: cuánto cuesta, quién puede operarla, qué pasa cuando se cae y cuánto duele migrarla. La documentación de iroh formula la respuesta en una sola frase que conviene tomarse como enunciado técnico y no como eslogan: a diferencia de los servidores tradicionales, los relevos no tienen estado; no almacenan los datos de tu aplicación, se limitan a facilitar conexiones. Esta lección desarrolla las consecuencias de esa frase, que son más numerosas y más económicas que técnicas.

🎯 Al terminar esta lección sabrás
  • Describir con precisión los dos cometidos de un relevo y el momento en que se retira.
  • Enumerar qué problemas operativos desaparecen cuando el intermediario no guarda estado.
  • Comparar el coste de operación frente al modelo de servidor de retransmisión clásico.
  • Identificar qué partidas siguen costando dinero y cómo se dimensionan.

Qué hace exactamente un relevo, y qué no hace

La documentación de iroh asigna al relevo exactamente dos cometidos y conviene no ampliarlos mentalmente. El primero es ayudar a perforar: cuando dos extremos se encuentran por primera vez, intercambian información de red a través del relevo para intentar una conexión directa. El segundo es transportar como reserva: si la conexión directa no se puede establecer, por traducciones de direcciones estrictas, cortafuegos u otras condiciones, el tráfico circula por el relevo. Nada más. En cuanto la ruta directa queda establecida, el relevo se aparta y los datos fluyen entre pares.

Hay un tercer hecho, negativo y decisivo: los servidores de relevo no pueden leer el tráfico que manejan, porque va cifrado de extremo a extremo. Esto no es una promesa de política de privacidad, es una consecuencia mecánica de lo que vimos en la lección anterior: la identidad es la clave, el establecimiento de sesión de TLS 1.3 ocurre entre los extremos, y el relevo mueve bytes que no puede interpretar. La propia documentación observa además que el relevo no participa activamente en la coordinación: reenvía paquetes cifrados sin saber si contienen datos de aplicación o mensajes de coordinación.

Merece la pena señalar que este patrón no es exclusivo de una biblioteca. El relevo de circuito de libp2p llega a la misma idea desde otro camino cuando permite al relevo acotar los recursos que dedica a cada reserva por número de conexiones, por tiempo y por bytes. En ambos casos la observación de fondo es idéntica: el intermediario solo es sostenible si lo que se le pide es acotado y no acumulativo.

Sin estado: qué desaparece de la lista de tareas

La ausencia de estado no se nota en el diagrama de arquitectura, se nota en el calendario del equipo de operaciones. La documentación de iroh enumera cuatro consecuencias y las cuatro son partidas de trabajo que dejan de existir.

No hay sincronización de bases de datos, porque no hay nada que replicar entre instancias de relevo. No hay migración de estado: cuando un relevo cae, los clientes se reconectan a otro sin pérdida de datos, porque no había datos que perder. El escalado es simple, ya que las instancias se levantan y se apagan como cualquier servicio ligero, sin ceremonia de rebalanceo ni particionado. Y la conmutación por fallo es automática, porque un extremo puede intentar conectarse a varios relevos y basta con que uno sea alcanzable para que los pares se encuentren.

⚠️
Sin estado no significa sin identidad ni sin control de acceso

Es fácil deslizarse de no guarda estado de aplicación a cualquiera puede usarlo, y son cosas distintas. Los relevos dedicados de iroh están autenticados por defecto: el relevo conoce qué claves de interfaz de programación de tu proyecto están permitidas, y tu extremo no presenta la clave sino un testigo firmado de vida corta acotado a su identidad, que la biblioteca acuña localmente. La clave nunca sale de tu aplicación; el relevo verifica firma y caducidad, y admite o rechaza en el saludo inicial. La revocación es inmediata y alcanza incluso a las conexiones ya abiertas. Y hay una precisión que la documentación subraya y que conviene repetir: la autenticación regula quién puede usar el relevo, no lo que el relevo puede ver, porque no puede ver nada en ningún caso.

// Configurar relevos propios es la unica decision de infraestructura que queda
use iroh::{Endpoint, RelayMode, RelayMap, RelayUrl};

let relevos = RelayMap::from_iter([
    RelayUrl::from(url_europa),
    RelayUrl::from(url_america),
]);

let endpoint = Endpoint::builder()
    .relay_mode(RelayMode::Custom(relevos))
    .bind()
    .await?;

Puesto todo junto, la documentación describe el resultado como una inversión del modelo tradicional: los relevos son facilitadores de conexión desechables, mientras que los clientes poseen todo el estado y toda la lógica de la aplicación. Esa palabra, desechable, es el núcleo económico de la lección: un componente desechable puede replicarse sin coordinación, apagarse sin aviso y sustituirse sin migración.

La economía frente al servidor de retransmisión clásico

Compara ahora dos hojas de cálculo. En el modelo clásico, el servidor recibe cada mensaje, lo almacena, lo indexa, lo entrega a los destinatarios y lo conserva por si alguien vuelve. Su coste crece con el volumen acumulado de datos y con el número de usuarios activos, y arrastra tres partidas que no aparecen en la factura del proveedor de nube pero sí en la nómina: copias de seguridad, migraciones de esquema y respuesta ante incidentes con datos de por medio. Cuando ese servidor cae, hay pérdida potencial y hay que restaurar; cuando hay que actualizarlo, hay ventana de mantenimiento.

En el modelo de relevo sin estado, el coste crece con el ancho de banda de la fracción que no consigue conexión directa, y con nada más. No hay volumen acumulado porque no se acumula nada. No hay copias de seguridad de lo que no se guarda. No hay migración de esquema donde no hay esquema. Y la caída de una instancia no es un incidente con datos, es una reconexión.

flowchart TD
subgraph CLASICO
  C1[cliente] --> S[servidor con base de datos]
  C2[cliente] --> S
  S --> BK[copias de seguridad y migraciones]
  S --> ESC[escalado con reparticion y coordinacion]
end
subgraph RELEVO
  P1[par con todo el estado] --> R[relevo sin estado]
  P2[par con todo el estado] --> R
  R -.-> P1
  P1 --> DIR[ruta directa validada]
  DIR --> P2
  R --> DESE[instancia desechable sin nada que migrar]
end
style S fill:#f38ba8,color:#11111b
style R fill:#a6e3a1,color:#11111b
style DIR fill:#89b4fa,color:#11111b
style DESE fill:#f9e2af,color:#11111b

Hay un factor multiplicador que conviene calcular antes de decidir nada. Si la perforación acierta en torno a nueve de cada diez configuraciones de red, como documenta iroh, el relevo solo transporta el tráfico de la décima parte restante, y solo mientras esa conversación dure. El resto del tráfico —el noventa por ciento— no pasa por tu infraestructura en absoluto, ni consume ancho de banda que pagues, ni aparece en tu factura. Ese es el cambio de escala real: no estás optimizando un servidor, estás sacando la mayor parte del tráfico del presupuesto.

Lo que sigue costando dinero

Sería deshonesto terminar aquí. Hay partidas que no desaparecen y conviene tenerlas escritas. La primera es el ancho de banda de la minoría que no perfora, que es tráfico real, sostenido y que además tiende a concentrarse en las redes corporativas y móviles, es decir, en usuarios que a menudo son los que más importan. La segunda es la cobertura geográfica: iroh funciona con un solo relevo, pero funciona mejor con relevos en cada región donde haya usuarios, y cada región es una instancia más.

La tercera es la disponibilidad. Los relevos públicos que la biblioteca trae de serie son gratuitos, están limitados por tasa para evitar abusos, no ofrecen ninguna garantía de tiempo de actividad ni de rendimiento y están compartidos con el resto del mundo; la documentación es explícita en que sirven para desarrollo y pruebas, y en que producción pide relevos dedicados. La cuarta, fácil de olvidar al planificar: los relevos públicos se operan para la última versión mayor de la biblioteca, de modo que quedarse atrás en versiones tiene un coste de infraestructura además de uno de mantenimiento.

🪶

Sin base de datos

Nada que replicar entre instancias y nada que restaurar tras una caída. El escalado es levantar procesos.

🔁

Conmutación automática

Varios relevos configurados, basta con que uno responda. La caída de uno es una reconexión, no un incidente.

📊

Coste por ancho de banda

Solo pagas el tráfico de quien no consigue ruta directa. La mayoría del tráfico jamás toca tu infraestructura.

🌍

Cobertura regional

Un relevo basta, pero la latencia mejora con relevos donde estén los usuarios. Cada región es una instancia más.

La ausencia de estado no es una optimización del servidor: es lo que decide quién puede permitirse operar una red

La lectura habitual de esta arquitectura se queda en la eficiencia: el relevo hace menos trabajo, luego cuesta menos, luego mejor. Es cierto y es lo menos interesante. Lo que de verdad cambia cuando el intermediario no guarda estado es el perfil de quién puede sostener la red, y esa es una cuestión de estructura de poder antes que de coste. Un servidor con estado impone tres obligaciones que no se pueden delegar ni externalizar: guardar los datos de otros, lo cual conlleva responsabilidad legal en cada jurisdicción donde haya un usuario; mantener la continuidad, porque perder el servidor es perder los datos y eso convierte cada copia de seguridad en una obligación contractual; y coordinar las réplicas, que es el problema técnico difícil que consume equipos enteros. Esas tres obligaciones son las que explican, mucho mejor que cualquier argumento sobre efectos de red, por qué el software colaborativo se concentró en un puñado de empresas capaces de asumirlas. Quitar el estado del intermediario disuelve las tres a la vez: no hay datos ajenos que custodiar porque van cifrados y no se almacenan, no hay continuidad que garantizar porque la caída de una instancia solo provoca una reconexión, y no hay coordinación entre réplicas porque no hay nada que coordinar. Lo que queda del servidor es un proceso que reenvía bytes opacos y que cualquiera puede levantar: tú, tu usuario, una asociación, un colectivo, un ayuntamiento. Y ese cambio de perfil es exactamente lo que hace posible el resto de este track. Una aplicación de datos primero en local sin relevos baratos es un experimento bonito que no llega a producción, porque el arranque en frío y la minoría que no perfora la matan en la primera semana de uso real. Con relevos que cuestan lo que cuesta reenviar paquetes, el argumento se invierte: el modelo entre pares deja de ser el que sacrifica comodidad por principios y pasa a ser el que además es más barato de operar, porque el noventa por ciento del tráfico no toca tu infraestructura y el diez restante no acumula nada. Fíjate en la consecuencia final, que es la que conviene llevarse: cuando la infraestructura mínima viable de una red entre pares cabe en un proceso desechable, la pregunta quién es el dueño de los datos deja de tener una respuesta impuesta por la economía y vuelve a ser una decisión de diseño. Eso es lo que este nivel entero ha estado construyendo.

⚔️ Haz las dos hojas de cálculo antes de elegir arquitectura
  1. Estima el tráfico mensual total de tu producto y separa la fracción que iría por relevo con una tasa de perforación del noventa por ciento.
  2. Repite el cálculo con una tasa del setenta por ciento y compara: la diferencia es tu sensibilidad al escenario pesimista.
  3. Enumera las partidas del modelo clásico que desaparecen en tu caso concreto: copias, migraciones, particionado, guardias.
  4. Despliega un relevo propio a partir del binario abierto y mide su consumo de memoria y de red con carga sintética.
  5. Configura dos relevos y provoca la caída de uno con tráfico en curso: cronometra cuánto tarda la reconexión en notarse.
  6. Escribe qué garantía de disponibilidad necesitas de verdad y decide si los relevos públicos limitados te sirven o no.