La arquitectura de Riot Games para desplegar parches a 33 millones de usuarios en videojuegos online
Un bug crítico casi rompe un videojuego online. Descubre la arquitectura de parches de Riot Games, la solución para desplegar hotfixes a escala masiva sin fallos.
Verano de 2019, Los Ángeles, California.
Un nuevo modo de juego dentro de League of Legends explota en popularidad. Se llama Teamfight Tactics (TFT) y en pocos meses alcanza los 33 millones de jugadores mensuales. Lo que empezó como un proyecto pequeño se convierte en un pilar para Riot Games.
Cada dos semanas, el equipo lanza un parche con nuevos campeones, objetos y mecánicas para mantener el juego fresco. Pero un viernes por la tarde, la comunidad descubre un bug crítico: un objeto llamado "Morellonomicón" está aplicando un daño decimal incorrecto, rompiendo el equilibrio del juego por completo.
Esperar al siguiente ciclo de parches de dos semanas es impensable. El juego necesita una solución, o los jugadores acabarán en Reddit criticándolo y dejando de jugar por estar roto. El equipo no dispone de días, sino de horas. Este tipo de crisis no se resuelve con parches convencionales; se necesita una arquitectura diseñada para la velocidad, la precisión y una escala masiva.
Este post resume la arquitectura de parcheo de Riot Games, un sistema diseñado para mantener mundos online masivos en constante evolución. Al final, encontrarás las referencias para profundizar.
Si quieres dominar el diseño de sistemas y recibir análisis como este cada semana, suscríbete. Te enviaré guías y plantillas para que diseñes sistemas robustos y escalables.
📖 Una historia de dos archivos
Los diseñadores de Teamfight Tactics (TFT) necesitaban moverse muy rápido. Para crear nuevas mecánicas de juego, como el carrusel de campeones o las sinergias de equipo, escribían la lógica en grandes archivos de script en Lua. Estos archivos eran como manuscritos gigantes donde todas las ideas estaban conectadas, permitiendo una iteración y experimentación veloces.
Cuando un bug aparecía, la solución parecía sencilla: corregir el script, codificar el archivo entero en Base64 y enviarlo al servidor como un "micropatch". El servidor, al iniciar una nueva partida, leería este archivo modificado en lugar del original. Rápido y efectivo, ¿verdad?
El problema llegó cuando dos bugs diferentes necesitaban ser corregidos en el mismo archivo monolítico y al mismo tiempo. El equipo A arreglaba el bug del objeto X y desplegaba el archivo. Minutos después, el equipo B arreglaba el bug del campeón Y y desplegaba su versión del archivo. Sin darse cuenta, el parche del equipo B sobrescribía la solución del equipo A, reintroduciendo el bug original. El caos estaba servido.
📦 El Desafío del Micropatch Monolítico
Este enfoque inicial, aunque ágil para el prototipado, generó problemas sistémicos a medida que el juego crecía en complejidad.
Ventaja inicial: Permitía a los diseñadores implementar y probar sistemas de juego complejos de forma muy rápida, ya que toda la lógica interconectada residía en un único lugar.
Problema de concurrencia: Desplegar un micropatch para un archivo "bloqueaba" cualquier otro cambio en ese mismo archivo. Para introducir dos correcciones, un ingeniero debía fusionar manualmente ambos cambios en un nuevo archivo, codificarlo y desplegarlo, un proceso lento y propenso a errores.
Alto riesgo de regresión: Como en la historia anterior, era extremadamente fácil reintroducir bugs antiguos al sobrescribir archivos, creando un ciclo frustrante de "un paso adelante, dos pasos atrás".
💡 Hacia una Arquitectura Desacoplada
Por eso crearon una nueva filosofía, una forma de aplicar principios de ingeniería de software robustos al mundo del scripting de videojuegos para lograr agilidad sin sacrificar la estabilidad.
🗺️ Modelos Comunes de Actualización para Servicios Live
Para mantener un juego online, existen varias estrategias generales.
Parches Completos Programados: El modelo tradicional. Todas las actualizaciones (código, arte, lógica) se empaquetan y se lanzan en fechas fijas, requiriendo que el jugador descargue una gran cantidad de datos.
Hotfixes del Lado del Servidor: Cambios rápidos que solo afectan a la lógica del servidor, sin necesidad de que el jugador descargue nada. Son ideales para ajustes de balance o correcciones de bugs urgentes
Configuración Remota Dinámica: Un sistema donde el cliente del juego obtiene valores de configuración (como el daño de un arma o el precio de un objeto) de un servidor central. Permite cambios instantáneos sin desplegar código nuevo.
Riot Games usa una estrategia híbrida que combina lo mejor de todos los mundos, separando fundamentalmente los datos que viven en el cliente del jugador de los que viven en el servidor.
⚙️ Deep Dive por Componentes
1. Parches Completos (Full Patches)
¿Para qué sirve? Para entregar cambios sustanciales que afectan al cliente del juego, como nuevos campeones, skins, mapas o características que requieren nuevo código o assets visuales.
Cómo funciona:
El equipo de desarrollo integra todos los nuevos assets y código en una nueva versión del juego.
Esta versión pasa por un riguroso proceso de QA interno y, a menudo, por un entorno público de pruebas (PBE).
Una vez aprobada, la nueva versión se distribuye globalmente a través de una CDN.
El launcher del jugador detecta la nueva versión, descarga los archivos necesarios y los instala.
Tecnologías clave: CI/CD pipelines (Jenkins, etc.), sistemas de control de versiones (Perforce, Git), Content Delivery Networks o CDN (como Akamai o Cloudflare) para la distribución global.
Este componente es la base estructural del juego. Las renovaciones periódicas que mantienen la experiencia fresca y expansiva. Van acompañadas de unas "notas del parche" o "notas de la versión"
2. Micropatches
¿Para qué sirve? Para desplegar cambios de lógica o datos del lado del servidor de forma casi instantánea, sin requerir una descarga del jugador. Es la herramienta para ajustes de balance y corrección de bugs críticos.
Cómo funciona:
Un ingeniero o diseñador modifica un archivo de datos (un script Lua o valores en el GDS (Game Data Server)).
Este archivo se codifica en Base64, convirtiéndolo en una larga cadena de texto.
Esta cadena se introduce en un archivo de configuración en los servidores de juego con una "micropatch key" específica.
Cuando un servidor de juego necesita cargar ese recurso, primero comprueba si existe una "micropatch key" para él.
Si la clave existe, el servidor decodifica la cadena de Base64 y utiliza estos datos en lugar de los que venían en la instalación original.
Tecnologías clave: Lua (para la lógica de juego), Base64 (para la codificación), un sistema de gestión de configuración para distribuir los overrides.
3. El GDS - Game Data Server
¿Para qué sirve? Para centralizar y servir todos los datos numéricos del juego: daño de habilidades, vida de los campeones, costes de maná, estadísticas de objetos, etc.
Cómo funciona:
Los servidores de juego, al iniciar una partida, consultan al GDS para obtener los parámetros de juego actualizados.
El GDS actúa como una fuente única de verdad para todos los valores numéricos.
Los micropatches pueden sobrescribir valores específicos en el GDS, permitiendo a Riot cambiar el daño de una habilidad de 100 a 95 en todos los servidores del mundo con un solo despliegue.
Tecnologías clave: Probablemente un sistema de base de datos distribuida o un servicio de key-value optimizado para lecturas rápidas y alta disponibilidad.
4. El Refactor de Scripts en Lua
¿Para qué sirve? Para resolver el problema de los micropatches monolíticos en TFT y hacer que el sistema fuera mantenible a largo plazo.
Cómo funciona:
El equipo de ingeniería impulsó un cambio cultural y técnico para reestructurar los scripts de Lua.
Aplicaron principios clave de la ingeniería de software como SOC - Separation of Concerns, DRY (Don't Repeat Yourself) y Abstracción.
Los enormes archivos monolíticos se dividieron en módulos más pequeños, enfocados y poco acoplados. Un módulo para el carrusel, otro para el combate, otro para las sinergias de rasgos.
Ahora, para corregir un bug en el carrusel, solo se necesita modificar y desplegar el pequeño archivo del módulo del carrusel, sin riesgo de afectar al sistema de combate.
Tecnologías clave: Lua, pero sobre todo, principios de diseño de software y una fuerte colaboración entre ingenieros y diseñadores.
Personalmente pienso que este videojuego fue un muy buen ejemplo de cómo juntar ingeniería y empresa. Fue un MVP en un proceso de Riot Games de crear más juegos aparte de League of Legends. Empezaron con estos scripts monolíticos y el éxito fue lo que les dio la validación de que aquí había un producto en el que invertir recurdsos.
5. Gestión de Parches Móviles
¿Para qué sirve? Para gestionar el despliegue de parches en plataformas móviles (iOS y Android), que tienen sus propias reglas y complejidades.
Cómo funciona:
Cualquier parche de cliente para móvil debe ser enviado a la App Store de Apple y a la Google Play Store para su revisión.
Este proceso de revisión puede introducir retrasos impredecibles.
Lo más crítico es garantizar la compatibilidad de
cross-play
. Un jugador de móvil con la versión 1.1b (que corrige un bug visual solo en móvil) debe poder jugar sin problemas contra un jugador de PC con la versión 1.1a.Para ello, se realizan pruebas exhaustivas en entornos de QA que simulan estas condiciones de versiones mixtas, asegurando que los clientes pueden comunicarse con el mismo servidor común.
Tecnologías clave: App Store Connect, Google Play Console, entornos de testeo dedicados para
cross-play
.
Al final, cada plataforma tiene un equipo de ingenieros dedicados. Corregir un bug en todas las plataformas de un videojuego online con cross-play
no puede tener un ETA distinto para cada uno.
✅ En resumen:
Para actualizar un mundo online con millones de jugadores, la arquitectura de Riot se basa en:
Separación fundamental: Los datos del cliente (assets pesados) están separados de los datos del servidor (lógica crítica).
Modelo híbrido: Combina grandes parches completos programados con pequeños y ágiles micropatches del lado del servidor.
Overrides inteligentes: Los micropatches funcionan como un sistema de anulación (override) que utiliza Base64 para empaquetar y desplegar cambios de lógica sin tocar el cliente.
Datos centralizados: El Game Data Server (GDS) actúa como una fuente única de verdad para todos los parámetros numéricos, facilitando los ajustes de balance.
Diseño de software en scripting: La evolución de TFT demuestra que aplicar principios como la Separación de Intereses a los scripts es vital para la mantenibilidad.
Complejidad multiplataforma: La gestión de parches móviles añade una capa de desafíos por las revisiones de las tiendas y la necesidad de garantizar la compatibilidad
cross-play
.Infraestructura a escala: Todo esto se apoya en una robusta red global de servidores (Riot Direct), CDNs para la distribución de contenido y pipelines de CI/CD altamente automatizados.
👋 PS – ¿Quieres dominar el system design?
📚 Referencias:
Riot Games Engineering Blog: technology.riotgames.com
Charlas de Riot Games en la GDC (Game Developers Conference) sobre infraestructura y operaciones live.
📝 Otros artículos de interés
👏 Aplauso semanal
Aquí algunos artículos que me han gustado esta última semana:
Aplica la IA para mejorar tu productividad por
. La productividad con IA es un proceso gradual que va desde aprender a usar prompts hasta automatizar tareas complejas, supervisando siempre los resultados. La base de todo sigue siendo el prompt.La Inteligencia Artificial ha cambiado mi mundo por
. La IA tendrá un papel fundamental en la automatización en los próximos años, y se pueden crear agentes de IA, como un asistente de marketing, para optimizar tareas.La seguridad se refuerza: lo nuevo en AWS WAF y más antes del re:Inforce 🔒 por
. AWS introduce una nueva capa de defensa contra ataques DDoS a nivel de aplicación con AWS WAF, además de mejoras en Powertools para Lambda, cifrado en AppSync y mayor precisión en Amazon Lex.- . Un experto en fiscalidad internacional explica las opciones legales que tienen los freelancers para reducir su carga impositiva, discutiendo temas como la residencia fiscal, la optimización de impuestos y los errores comunes.
🔍 Qodex.ai: API testing inteligente con generación automática de pruebas y plan gratuito 🚀 por
. Qodex.ai es una herramienta que utiliza IA para generar y ejecutar pruebas de API automáticamente a partir de su documentación, reduciendo el esfuerzo manual y ayudando a detectar errores rápidamente.
🙏 Una última cosa antes de que te vayas:
Siempre estoy trabajando para hacer esta newsletter aún mejor.
¿Podrías tomarte un minuto para responder una encuesta rápida y anónima?
Nos vemos en el próximo correo,
Fran.