Estoy usando una escala básica de NodeJS con arquitectura Redis , pero tengo problemas para configurar esto para que se adapte a un juego multijugador en tiempo real.
Mi juego multijugador debe tener salas separadas, de modo que cuando el balanceador de carga coloca a un usuario en un servidor separado, no hay forma de que los jugadores en la misma sala puedan comunicarse, a menos que use Redis . El problema es que no puedo enviar cada acción de un lado a otro entre los servidores, ya que eso sobrecargaría Redis y arruinaría la escalabilidad de las instancias del servidor, ya que ahora tengo que almacenar a cada usuario en cada instancia de NodeJS (para compruebe si hay colisiones, etc.), lo que anula el propósito de escalar. A menos que esté haciendo algo mal?
Arquitectura básica de NodeJS/Redis (¿Ineficiente para un juego io con vestíbulos?)
También agregué un Administrador en ejecución separado que configura (crea/elimina salas de espera) las salas de espera y envía la información a las instancias de Worker a través de Redis, para que los usuarios puedan ver las salas de espera disponibles.
Pensé en tener cada instancia de NodeJS como un lobby separado, pero el balanceador de carga no funciona de esa manera. Además, no hay escalado automático.
Mi arquitectura actual, mostrando jugadores (usuarios)
Red
es para los usuarios.
Light Pink
es para usuarios sincronizados a través de Redis desde otros servidores en sí mismo (de lo contrario, los jugadores de otras instancias no serían visibles entre sí. Además, no podrían realizar actualizaciones simples, como la detección de colisiones)
Cada jugador está en su propio lobby
elegido, y es un objeto que posee X
, Y
, angle
y varios otros parámetros.
Aunque los usuarios se unirían a Worker 2
o Worker 'n'
, todavía necesito transmitir los perfiles de usuario a otros trabajadores; de lo contrario, los usuarios que no están en el mismo Worker
, no serán visibles entre sí. Ahora, en este caso, ¿no anula por completo el propósito de escalar?
¡O estoy haciendo algo muy mal, o estoy seguro de que tiene que haber una solución para esto!
EDITAR
Esto es lo que se me ha ocurrido hasta ahora, aunque no estoy seguro de si es plausible.
No estoy recibiendo prácticamente ninguna ayuda, algunos comentarios serían muy apreciados.
Publicar comentario como respuesta.
Según el comentario, el juego se juega entre equipos y cada equipo tiene algunos miembros, pero cada miembro del juego debe conocer a otros miembros (no solo a los miembros de su equipo), dado que cada miembro debe conocer a todos los demás miembros del juego. es bueno ir con este diseño.
Aunque la segregación debe hacerse a nivel de juego, cada juego debe tener su propio conjunto de Lobbies y cada lobby debe contener a todos los jugadores.
No tenemos que ejecutar trabajadores para cada Lobby, sino que se puede usar un trabajador para un juego y eso actualizará todos los datos del Lobby.
Además, Loadbalancer no se debe usar para distribuir jugadores entre los trabajadores, sino que se debe usar un middleware en la aplicación como GamePlayerManager/LobbyPlayerManager para agregar/eliminar un jugador a/de un lobby específico.