Información sobre la arquitectura perfecta del servidor MMO

9

Estoy buscando cualquier material en servidores MMO sin problemas. Tengo algunos artículos en los libros "Desarrollo de juegos multijugador masivo" y "Gemas de programación de juegos 5". ¿Alguien tiene experiencia en ese tema o conoce artículos sobre eso?

Me interesan las "vistas de alto nivel" y las implementaciones. Este podría convertirse en el tema de mi tesis de maestría y me gustaría saber qué tan difícil es escribir un sistema de este tipo, antes de comenzar realmente la tesis. En este momento no he decidido qué idioma usar, estoy pensando en Java o Scala. Erlang podría ser una opción, pero nunca he trabajado con eso.

Nota: El requisito básico sería el movimiento. Cualquier otro sistema de juegos es opcional y otorga "crédito adicional".

Ahora, por lo que quiero decir con "servidor sin interrupciones": quiero configurar un clúster de servidores donde cada nodo controle alguna parte del mundo del juego, con límites estáticos. Los jugadores ahora pueden moverse de un extremo del mundo al otro sin cambiar una instancia o golpear a algún "teletransportador". Creo que WoW hace eso. Sin embargo, en mi back-end, el reproductor pasa de un servidor a otro.

Lurca
fuente
Hace un tiempo, leí que cada servidor WoW contiene más de 5 blades: 1 para cada continente y la base de datos. Solía ​​ser también las mazmorras y los campos de batalla, aunque supongo que ahora esos residen en sus propios grupos para permitir conexiones entre reinos. En resumen, los continentes se mantienen en un servidor: no hay un punto en el que pases a otro servidor a menos que cambies de continente.
Clemencia
Interesante, ¿recuerdas dónde lo leíste? Como dije, nunca reproduzco WoW y no sé qué tan grandes son los continentes, pero no puedo imaginar que cada continente esté alojado en un servidor separado.
Lurca
3
Estadísticas del servidor de WoW: 13,250 blades de servidor totales, 75,000 núcleos de CPU totales, 112.5 terabytes de RAM (a partir de GDC Austin 09). Mira aquí ; no necesariamente todos dedicados a WoW, pero razonablemente lo suficientemente cerca.
@ Josh Petrie: Gracias, encontré este artículo a principios de este día. Pero todavía estoy buscando cosas sobre arquitectura de servidor continua o sin interrupciones.
Lurca
1
Relacionado ¿Cómo se logra el equilibrio de carga en los MMO?
Hendrik Brummermann

Respuestas:

5

La principal complejidad en la administración de un sistema de este tipo proviene de lo impecable que necesita que sea. Como Josh ha dicho, resolver el problema de transferir una entidad de un servidor a otro es una parte clave del paquete.

Sin embargo, este no es el único problema: si las entidades en varios servidores necesitan interactuar como parte de una operación, ahora tiene un problema de sincronización en el que cada sistema necesita datos del otro lado para continuar, pero para cuando lleguen los datos, puede Ya no es válido. Puede intentar resolver esto dividiendo la operación en múltiples mensajes con capacidad de reversión si un lado retrocede, pero como ha visto en el Capítulo 3.1 en "Desarrollo de juegos multijugador masivo", esto complica significativamente cualquier lógica de juego que deba haz esto con. Scala y Erlang lo ayudan a obtener el sistema de mensajería correcto; no lo ayudan con la descomposición de lo que solía ser una función de 10 líneas en los diferentes mensajes y estados que ahora necesita rastrear.

Obviamente, este problema no es completamente nuevo, y las bases de datos relacionales admiten este tipo de problema almacenando todos los datos de forma centralizada y permitiendo que varios clientes consulten y modifiquen según lo necesiten, revertiendo las transacciones donde sea necesario. Esto le brinda la mayoría de sus requisitos de corrección, pero desafortunadamente impone problemas de rendimiento poco prácticos y hace que la implementación de la lógica del juego sea incómoda (ya que gran parte de su lógica ahora está escrita en procedimientos almacenados en la base de datos). Un tipo diferente de base de datos podría proporcionar una buena solución aquí, especialmente si está dispuesto a cambiar los requisitos de confiabilidad que la mayoría de los RDBMS proporcionan.

La mayoría de los juegos profesionales resuelven este problema sin siquiera intentarlo, manteniendo el tamaño del fragmento lo suficientemente pequeño como para poner a todos los jugadores en un servidor, dividiendo el mundo en partes que realmente no interactúan (vea el ejemplo de WoW en los comentarios anteriores) , o distribuyendo el juego a través de servidores en función de la función en lugar de la geografía (por ejemplo, todos los combates ocurren en un servidor, todos chatean en otro) para que no haya 'costuras' con las que lidiar.

Kylotan
fuente
3

Me interesan las "vistas de alto nivel" y las implementaciones.

Las implementaciones generalmente están razonablemente involucradas y probablemente no verá mucho hablar de ellas aquí. El software StackExchange no es adecuado para ese tipo de discusión involucrada, sin mencionar que implicaría una inversión significativa del tiempo de alguien.

Me gustaría saber qué tan difícil es escribir un sistema así

No es más o menos difícil que cualquier otro sistema: dependerá de sus requisitos y de las características que desee manejar. Puede escribir implementaciones triviales trivialmente, pero las cosas no triviales, por supuesto, serán mucho más difíciles. Uno de los mayores problemas es que probablemente no tendrá suficientes clientes reales para saber si su sistema realmente escala al nivel "masivo" en el que operan WoW y otros juegos.

Los MMO no son mágicos. La mayor parte de su tecnología no es nada especial cuando se toman de forma aislada, es simplemente que se combinan una cantidad de bits más pequeños y simples de manera muy inteligente para permitir simulaciones paralelas conectadas a mayor escala de algún estado mundial compartido.

Quiero configurar un clúster de servidores donde cada nodo controle alguna parte del mundo del juego, con límites estáticos. Los jugadores ahora pueden moverse de un extremo del mundo al otro sin cambiar una instancia o golpear a algún "teletransportador".

Esencialmente de lo que estás hablando es de la transferencia de simulación. Esto se puede hacer de manera bastante simple y no es necesariamente una tecnología específica de MMO (los juegos entre pares tienden a admitir los mismos mecanismos subyacentes para implementar la migración del host). La premisa básica es que cada servidor comprenda la topología de los servidores "a su alrededor" (específicamente, un servidor para el nodo mundial A debe conocer los servidores para los nodos mundiales adyacentes de simulación), así como definir un búfer alrededor del cual usted considere una entidad simulada particular "cerca" de un servidor adyacente.

Cuando una entidad ingresa al búfer de "cierre", también comienza a informarlo al servidor adyacente. Una vez que la entidad cruza el umbral real, envía un mensaje al servidor adyacente con el estado completo de la entidad y un mensaje que indica que el servidor adyacente debe hacerse cargo de la entidad. Obviamente, usted quiere que esto sea lo más confiable posible.


fuente