Mejoras al backend de TecnoMakers Cardbattle
El mes pasado lo dedique en especial, a hacer algunas mejoras de contenido, y preparar el contenido para el futuro, pero hay algo, que debe terminarse, y eso es el BACKEND, en otras palabras, el software que hace falta, para poder tener el juego online, funcionando sin caídas, escalado horizontal automático pero de procesos en la misma maquina, etc.
Desde que empece el desarrollo del juego, me centre en lo que se conoce como la instancia del juego, que es lo básico para poder entrar, configurar tus mazos, hacer una partida, etc.
A medida, que fue pasando el tiempo, fui investigando sobre lo que se conoce como Multi Instancia, que es para que los MMORPG (Juegos online multijugador) soporten altas cargas, dentro de todo esto, se encuentran varias cosas:
- Servidores de login
- Procesos para las instancias de juego/mapas
En Junio del año pasado, comencé a tener el primer esbozo de como quería hacer la infraestructura a nivel de software, sobre noviembre conseguí hacer lo que era, la base de todo esto, separar el proceso de la instancia para jugar, de las demás (login, servidores y sesiones)
Y hasta este mes, no he vuelto a continuar todo lo relacionado con el sistema multi instancia, programe hace semanas, los 3 procesos adicionales mencionados entre paréntesis y he decidido dividir, en unas 3 fases la implementación, ya que es un proceso, muy delicado y que necesita muchas pruebas iniciales para el buen funcionamiento.
Voy a haceros un repaso de las fases de implementación:
Fase 1 (Puesta en marcha básica)
Esta fase consistía en iniciar 4 procesos de manera manual, y mirar si lo que se hizo en su día, la llamada «base» en Noviembre, seguía funcionando igual y sin problemas adicionales.
Fue toda una tarde, la cual me encontré con problemas, de como los procesos se comunicaban entre ellos, pero al final pude solucionarlo, porque la idea es tener 2 procesos maestros que reciban mensajes a un puerto interno, y que se hablen entre ellos (server-server), y tener un código de respuesta de servidor, que lo que hiciese es cambiar a la persona que esta jugando al juego, de una instancia a otra, de manera rápida y transparente.
Fase 2 (Mover el buscar rival de instancia al maestro de sesiones)
El siguiente paso, era iniciar una segunda instancia, y tenerlas interconectadas cuando alguien esta buscando un rival para jugar, porque imagínate que las 2 personas que están conectadas, cada una se las envía a una instancia diferente ¿que haces?
El proceso es facil, mover el codigo de buscar rival del nivel de instancia de juego, al maestro de sesiones, por lo que cuando alguien se apunta a buscar rival, la instancia de juego notifica al maestro de sesiones, que esta persona esta buscando a alguien.
Cuando esta empareja rivales para jugar, como tiene todos los puertos de cada instancia, comprueba si están en la misma, en caso afirmativo, manda un mensaje a la instancia para que empiece la partida, pero en caso negativo, se escoge un jugador/a para que sea el anfitrión/a de la partida y se moverá al otro usuario/a a donde esta la anfitrión/a, cuando este/a este conectado/a, y el servidor lo verifique, la partida empezara.
Pero..
Si, hay un pero, imagínate que las 2 instancias están cerca del limite que he quiero poner, como por ejemplo 200 conexiones simultaneas, se buscara la instancia con menos carga, y se mandara ahí a las 2 personas, esto ultimo lo implementare en la Fase 3.
Fase 3 (Automatización)
La ultima fase, la mas importante por la cual se ha hecho todo este proceso es poder ir levantando instancias, o bajándolas en caso que haya mas o menos carga, también incluyendo un control de si la instancia de juego se cierra de manera inesperada por un error en el código de ejecución, poderla levantar de nuevo sin mi intervención.
A parte de este desarrollo, incluiré lo ultimo que mencione en la fase 2, con esto tendré de manera automatizada, el control de carga del juego, pero a nivel de 1 sola maquina, ya que no tengo los recursos necesarios, ni monetarios, para preparar una infraestructura de varios servidores de manera horizontal.
Un ejemplo puede ser este, que es el caso para conectar a alguien, a una instancia de juego.
Espero que os haya gustado, este articulo, a nivel informativo, de todo lo que estoy preparando en el juego, que a nivel visual, no se puede ver, pero existe, actualmente a nivel de procesos dentro del servidor que tengo funcionando el juego.
Mas información: https://www.reddit.com/r/gamedev/comments/64o4bh/can_someone_explain_how_mmo_servers_work/