Formato de registro de juego para servidores MMO


12

Un registro de eventos del juego (en oposición a los registros de errores / depuración) para un clúster / fragmento completo es muy útil para un MMO comercial que se encuentra en un entorno de producción en vivo, ya que proporciona un soporte vital para el servicio al cliente y los medios para el análisis histórico.

El proyecto en el que estoy trabajando actualmente utiliza una base de datos relacional para almacenar todos los registros de eventos del juego, y aunque ese método funciona bien, me parece que la naturaleza cronológica de solo lectura de los registros permitiría un formato de almacenamiento más eficiente .

Sin embargo, no estoy seguro de dónde comenzar a aprender sobre la creación de formatos de registro binarios personalizados. ¿Cuáles son sus experiencias con la creación de formatos de registro personalizados o cualquier artículo / artículo recomendado sobre el tema?

Respuestas:


7

En Stendhal resolvimos el problema de rendimiento agregando eventos del juego a una cola y luego procesándolos de forma asíncrona en segundo plano .

En nuestro caso, los eventos no son solo registros, sino objetos que tienen un poco de lógica porque en algunos casos necesitamos hacer dos inserciones con un enlace entre ellos. Por ejemplo, la primera vez que se maneja un elemento en el juego, primero debe insertarse en la tabla de elementos antes de que se pueda registrar un evento de elemento.

Pero escribir el registro es solo un lado del problema:

¿Qué preguntas quieres responder con los registros?

Es fácil leer el registro completo en orden cronológico; o para filtrarlo para un jugador.

Pero puede haber preguntas como:

  • ¿Qué objetos ha puesto Anton en el suelo que Beth recogió ayer? ¿Qué jugador los posee ahora? (Anton se quejó de que le robaron su artículo)
  • ¿Cuánto tiempo necesita un jugador promedio para alcanzar el nivel 100? ¿Qué jugadores han sido significativamente más rápidos? solo para los primeros personajes?
  • ¿Hay jugadores que manejan grandes cantidades de dinero del juego? ¿A qué jugadores se pasa? ¿Sin nada valioso a cambio?
  • ¿Los jugadores débiles pueden matar criaturas fuertes que no deberían poder matar legalmente?
  • ...

En Stendhal usamos una base de datos relacional para los registros de juegos porque esa es la forma más fácil de permitir consultas ad-hoc con rendimiento. Si utiliza un formato de registro personalizado, básicamente debe codificar todas esas consultas cuando sea necesario. Y hacerlo con un rendimiento suficiente se vuelve bastante difícil.

Nuestra tabla de eventos de juego tiene 51,429,139 filas (el año pasado) y tenemos una tabla de registro de ítems dedicada que tiene 60,360,657 filas (todo el tiempo) para 15,893,831 artículos.


¿Qué tan rápido está buscando a través de su base de datos? Tengo una base de datos similar con registros y tenemos alrededor de 100,000,000 filas después de tres meses. Usamos MySQL como almacenamiento y su rendimiento es malo. La consulta simple que enumera todas las acciones de las filas de un jugador (solo 20,000) lleva a menudo más de 60 segundos.
Balon

1
Las consultas simples en columnas de índice son instantáneas. Las consultas complejas pueden demorar un poco, ocurren 60 segundos, pero son muy raras. Indexamos la tabla muy fuertemente y compensamos la penalización en la inserción haciéndolas de forma asincrónica.
Hendrik Brummermann

Hmmm, creo que mi problema es que el conjunto de resultados es bastante grande, a menudo entre 3000 y 150000 registros para un jugador. Entonces, esta puede ser la razón por la que lleva tanto tiempo, porque funciona muy rápido para pequeños conjuntos de resultados.
Balon

4

¿Qué quieres decir con eficiencia? Ya sea el tamaño en el disco o la velocidad de consulta, una base de datos relacional seguramente superará o igualará su formato binario patentado, y será mucho más fácil y más flexible de usar.

Cada tabla que usa en una base de datos relacional le permite especificar con precisión el byte cuánto espacio por fila va a permitir. Si no está registrando texto sin formato, y el "registro de eventos del juego (en oposición a los registros de errores / depuración)" implica que no lo está, o al menos no necesita, entonces el enfoque de campo de ancho fijo de un la base de datos relacional es bastante cercana a la óptima en términos de espacio, lo que los hace bastante rápidos en primer lugar. Además de eso, las bases de datos relacionales son bastante útiles para crear índices de acceso muy rápido y para optimizar las consultas para aprovecharlas al máximo.

Así que te recomiendo seguir con lo que tienes.


¡Gracias por la respuesta (y gracias a los demás que enviaron las respuestas a continuación)! Cuanto más lo pienso, más parece que un RDBMS es el ajuste adecuado para este tipo particular de registro. No sería demasiado difícil diseñar un formato de registro personalizado que estuviera bien indexado para los tipos básicos de búsquedas, pero con el tipo de consultas complicadas que a menudo utilizan las CSR y los análisis de juegos es necesario un enfoque más general, en ese momento un producto establecido tendrá un rendimiento superior en la mayoría de los casos.
Charles Ellis

La configuración personalizada del registro de eventos sería útil para la reproducción estrictamente cronológica de las grabaciones de demostración de FPS, pero ese es un problema muy diferente de resolver. ¿Alguien tiene experiencia en el desarrollo de algo similar a las grabaciones de demostración para juegos multijugador masivo cliente-servidor?
Charles Ellis

Dependiendo de su modelo de procesamiento lógico del lado del servidor, puede ser posible almacenar cada entrada, marcada con la hora de llegada al servidor, que puede reproducirse. El problema tiende a surgir en la reproducción, ya que debe reproducir cada entrada y modelar cualquier otro factor (por ejemplo, semillas aleatorias, entrada implícita, como cosas que se alteran en función de la latencia, etc.). Pero aquí no hay un sistema único para todos, depende de cómo funcione su servidor.
Kylotan

3

Es cierto que probablemente podría guardar algunos bytes con un formato personalizado, o simplemente texto comprimido, el almacenamiento es barato, por lo que ya no vale la pena optimizarlo. Lo que es más importante es ocuparse de cosas como el almacenamiento en búfer de E / S y las consultas, las cuales un servidor SQL estándar probablemente funcione bastante bien. Si está funcionando para ti en esos frentes, correría con él. Escribimos nuestro propio servidor de registro de almacenamiento en búfer que escribe en archivos personalizados y luego tiene un programa analizador separado para leerlo en una base de datos para consultas, no lo recomendaría.


0

Las bases de datos relacionales en estos días se ven afectadas por ser ineficientes, pero al almacenar el tipo de registros del que estás hablando, realmente no necesitas eficiencia porque el juego o sus usuarios no tendrán acceso constante a ellos, solo tu equipo necesitará para leer los datos

Así que la "eficiencia" no importa tanto. Lo que más importa es ordenar los datos de una manera que facilite contar la historia de lo que los usuarios están haciendo en el juego. Sus desarrolladores generalmente necesitarán consumir estos datos y mostrarlos en una interfaz que sea fácil de leer para los analistas y los analistas a veces necesitarán consultar los datos para profundizar en el comportamiento del usuario. Por ejemplo, si los jugadores compran un determinado artículo antes de una actualización, pero dejan de comprarlo después de una actualización, un analista se beneficiará escribiendo ciertas consultas que expongan ciertos números sobre el comportamiento que rodea esa compra para determinar por qué los usuarios ya no lo compran. Es mejor si tienen un lenguaje de consulta estándar para trabajar que esté bien documentado. Si tienen que hacer estas consultas en un formato binario personalizado, sus trabajos serán MUCHO más difíciles,

En general, los eventos del juego se parecen a esto (este es el formato de DeltaDNA en particular)

{
 "eventName":"specific event code – eg. gameStarted",
 "userID":"ABCD1-4321a879b185fcb9c6ca27abc5387e914",
 "sessionID":"4879bf37-8566-46ce-9f3b-bd18d6ac614e",
 "eventTimestamp":"yyyy-mm-dd hh:mm:ss.SSS",
 "eventParams":
  {
   "platform":"WEB",
   "param1":"stringParam",
   "param2":true,
   "param3":1234,
   "param4":["a","b","c"]
  },
}

El evento generalmente incluye un nombre de evento, una ID de usuario, una ID de sesión, marca de tiempo y parámetros que le permiten registrar cualquier dato que encuentre útil para registrar alrededor de ese evento. Y en mi experiencia, los formatos de bases de datos relacionales son los mejores para registrar dicha estructura.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.