Reescritura completa, en Go, del backend de un MMORPG de gran escala. Tres servicios en microservicios, protocolo binario propio, simulación de mundo y combate en tiempo real.
Contexto
Backend de MMORPG de gran escala reescrito desde cero en Go. El proyecto nace con dos motivaciones: ejercitar concurrencia y diseño de sistemas distribuidos al máximo, y reemplazar un stack Java legacy por algo más simple, más rápido y más mantenible.
Arquitectura
El sistema está partido en tres servicios (game, auth, chat) que se comunican por gRPC sobre una capa de datos compartida en MySQL con GORM. Cada servicio tiene su propio ciclo de vida, su propia state machine de sesiones y su propio router de paquetes. La lógica de juego vive casi toda en game, pero auth y chat pueden escalarse horizontalmente por separado.
El protocolo de red al cliente es binario, con cifrado propio, y el routing de paquetes depende del estado actual de la sesión (handshake, login, in-world, etc.). Cada paquete entrante se enruta a un handler y termina como una acción encolada en el actor del jugador.
Concurrencia
La pieza clave es el actor model: cada jugador es un actor con una cola de acciones. Las entradas del cliente, los eventos del mundo y los efectos de otros jugadores se procesan en orden, uno por uno, sin necesidad de mutex globales. Esto hace que la lógica de juego sea razonable en single-thread y el sistema escale por cantidad de jugadores en lugar de por complejidad de locking.
Simulación
El mundo se divide en regiones con visibilidad por KnownList, IA de NPCs con patrones de walking / chase / leash, sistema de combate con cálculos de daño físico y mágico, geometría 3D con raycasting para line-of-sight, y todo el soporte necesario (inventario, skills, party, alliance, trade, mail, quest, teleports, etc.).
Tooling
El proyecto viene con su propio CLI en Bash + gum para build, run, debug (Delve), migraciones y packaging cross-compile. Hot-reload en dev con air, orquestación con docker-compose en dev/prod, y scripts de data loading para los XML estáticos del juego.