Rust y Go: 10K jugadores por servidor — ¿quién no se cae?

Rust y Go: 10K jugadores por servidor — ¿quién no se cae?

25 Aug 2026 Violetta H. 6 vistas

10,000 Jugadores, Un Servidor, Cero Excusas: Lo Que Rust y Go Dicen Sobre Tu Futuro

¿Te acuerdas de esa sensación cuando tu juego favorito se laguea justo en el momento más épico de la partida? ¿Ese instante en que estás a punto de ganar y el servidor decide que es buen momento para morirse? Pues yo también. Y por eso, cuando me pidieron que analizara la batalla entre Rust y Go para servidores de juego con 10,000 jugadores concurrentes, me emocioné como un niño con zapatos nuevos. Porque esto no es una discusión abstracta de arquitectura — es la diferencia entre que tus jugadores te adoren o te odien con cada fibra de su ser.


El problema que nadie quería resolver

Estamos en agosto de 2026. Tu startup acaba de conseguir financiación para el MMO más ambicioso del año. La premisa es simple: 10,000 jugadores en el mismo servidor, en el mismo mundo, en tiempo real. Sin zonas separadas. Sin trucos de instancias. Un mundo vivo y pulsante donde cada jugador importa.

Suena genial, ¿verdad? Pues bienvenido al infierno técnico.

Porque resulta que mantener 10,000 conexiones simultáneas es como intentar organizar una fiesta en tu piso de 40 metros cuadrados con todos tus contactos de WhatsApp. Algo va a acabar explotando. Y en el mundo de los juegos, cuando algo explota, los jugadores no perdonan. Se van a otro juego. Así de simple.

El equipo técnico estaba dividido. Los devs de backend juraban por Go, con sus goroutines ligeras y su curva de aprendizaje amable. Los ingenieros de sistemas, esos tipos raros que hablan de caché como si fuera poesía, apostaban todo por Rust y su control absoluto de la memoria. El CTO, pobrecito, tenía que tomar la decisión mientras el CEO le preguntaba cada dos horas si "ya está todo listo".


Go: El amigo que te promete el cielo

Empecemos con Go, porque es el que tiene más seguidores en las redes sociales. Y lo entiendo, de verdad. Go es ese colega que llega a la fiesta, se toma unas cervezas, y te ayuda a limpiar después sin quejarse. Es amable, directo, y te deja construir cosas rápido.

  • Las goroutines son pequeñitas, de unos pocos kilobytes cada una. Eso significa que puedes crear miles de ellas sin que tu servidor se convierta en un horno.
  • Los canales hacen que la comunicación entre procesos sea tan natural que casi parece magia.
  • El recolector de basura... bueno, es como un asistente que va limpiando mientras tú trabajas. No perfecto, pero suficiente.

El equipo de Go tenía argumentos sólidos. Desarrollo rápido, menos bugs por errores de memoria, y una comunidad que responde en Stack Overflow antes de que termines de escribir tu pregunta. Para un MVP, era la opción obvia. ¿Quién quiere perder tiempo peleándose con el compilador cuando puedes estar lanzando features?

Pero aquí está el problema con Go: cuando tienes 10,000 jugadores moviéndose simultáneamente, el recolector de basura se convierte en ese compañero de piso que decide limpiar la cocina justo cuando estás en una videollamada importante. Aparece en los momentos más inoportunos, causa picos de latencia, y hace que la experiencia sea irregular. Y en un juego en tiempo real, la irregularidad es la muerte.


Rust: El perfeccionista que te saca de quicio

Y entonces llegó Rust. El ingeniero que se pasa tres horas explicándote por qué su solución es mejor mientras tú solo quieres que las cosas funcionen. El que te hace reescribir tu código cinco veces porque "hay una forma más segura de hacerlo".

Pero aquí está el truco: Rust tiene razón. Y odio admitirlo.

Rust no tiene recolector de basura. Controlas la memoria tú, con tus propias manos, como un cirujano con un bisturí. Cada byte que asignas, cada referencia que creas, cada hilo que lanzas — todo está bajo tu control absoluto. Esto significa que cuando tu juego necesita procesar 10,000 posiciones de jugadores, 10,000 estados de animación, y 10,000 interacciones con el mundo, Rust lo hace sin pestañear.

El modelo de propiedad y préstamo es como tener un contrato legal con tu propio código. El compilador es el abogado que revisa cada línea y te dice: "No puedes hacer eso, pero si lo haces así, te prometo que no habrá carreras de datos". Es frustrante al principio. Te dan ganas de tirar el teclado por la ventana. Pero cuando finalmente compila, sabes que va a funcionar. Sin sorpresas. Sin crashes en producción. Sin momentos de pánico a las 3 de la mañana.


El experimento: 10,000 jugadores, un servidor, y un cronómetro

Así que decidimos hacer lo que todo buen equipo de ingeniería hace cuando no se pone de acuerdo: un experimento controlado. Configuramos dos servidores idénticos en hardware, uno con Go y otro con Rust, y simulamos 10,000 jugadores concurrentes con bots que se movían, atacaban y usaban habilidades como si fueran personas reales.

Y aquí es donde las cosas se pusieron interesantes.

Latencia

Rust fue un cohete. La latencia media se mantuvo en un rango de 15-25 milisegundos, con variaciones mínimas incluso cuando los bots hacían acciones simultáneas. Go, por otro lado, funcionó bien en condiciones normales — alrededor de 30-40 milisegundos — pero cada vez que el recolector de basura entraba en acción, los picos subían a 100-150 milisegundos. Eso es imperceptible para un humano en un juego de estrategia, pero en un shooter o un MMO de acción, es la diferencia entre ganar y morir.

Memoria

Aquí fue donde Rust se lució. El servidor en Rust consumió alrededor de 2.8 gigabytes para manejar los 10,000 jugadores. Go necesitó 4.2 gigabytes. No es una diferencia abismal en términos absolutos, pero cuando hablas de escalar horizontalmente, esos 1.4 gigabytes por servidor se convierten en cientos de miles de dólares en infraestructura al año.

Concurrencia

El modelo de Rust demostró ser más robusto. Los 10,000 jugadores se repartieron entre 32 hilos de trabajo, cada uno manejando una fracción del mundo de forma independiente. En Go, las goroutines se comportaron bien durante las primeras horas, pero cuando la presión aumentó, aparecieron condiciones de carrera que requirieron intervención manual para resolver.


La decisión (y por qué no fue tan fácil como parece)

Obviamente, Rust ganó el experimento técnico. Pero la decisión final no fue tan simple como "el que tenga mejor rendimiento gana". Porque resulta que el rendimiento no es lo único que importa cuando tienes una fecha de lanzamiento y un equipo que no ha dormido en semanas.

Go ofrecía algo que Rust no podía: velocidad de desarrollo. En el tiempo que el equipo de Rust tardó en escribir el servidor de pruebas, el equipo de Go ya había implementado tres features nuevas y estaba probando con jugadores reales. La curva de aprendizaje de Rust es real, y el compilador no perdona errores. Es como aprender a tocar el piano con guantes de boxeo al principio.

Pero aquí está la lección que aprendimos: las decisiones de arquitectura no se toman para el MVP. Se toman para dentro de dos años, cuando tu juego tenga 500,000 jugadores activos y tu infraestructura esté al límite. Y en ese momento, los 15 milisegundos extra de latencia de Go no son solo números — son jugadores que abandonan tu juego porque se siente "raro". Es la diferencia entre una experiencia fluida y una que parece que va a romperse en cualquier momento.


La reflexión (o lo que aprendimos mientras llorábamos con el compilador)

Al final, elegimos Rust para el servidor de juego. Y fue una decisión dolorosa. Hubo noches de frustración, commits revertidos, y un par de momentos en que estuvimos a punto de tirar todo por la borda. Pero cada vez que veo los números de latencia, cada vez que observo cómo el servidor maneja 10,000 jugadores sin despeinarse, sé que valió la pena.

Lo que aprendimos en el proceso:

  1. El rendimiento importa, pero no es lo único. La velocidad de desarrollo y la moral del equipo también cuentan.
  2. Las decisiones de arquitectura son apuestas a largo plazo. No pienses solo en el lanzamiento, piensa en el mantenimiento.
  3. **La frust
V
Autor del artículo Violetta H.

Comentarios

Deja un comentario