Descargo de responsabilidad: mi experiencia en programación de juegos se basa en juegos de un solo jugador del lado del cliente, pero tengo experiencia en aplicaciones web (específicamente en la pila de Microsoft), así que de ahí vengo con esta respuesta, creo que eso sería aplicar, pero sin probar realmente un servidor de juego real es difícil decir cómo se aplicará, pero aquí va. Sepa esto: no he implementado un servidor de juegos, solo aplicaciones web.
Sugeriría un enfoque de dos niveles (servidor). Un nivel de base de datos y un nivel de "aplicación"; con el tercer nivel (presentación) siendo su cliente del juego.
Las bases de datos relacionales son excelentes para consultar datos y decentes para escribir datos. La clave es serializar las escrituras de su base de datos en fragmentos de tamaño manejable que su clúster puede manejar. Las ediciones más avanzadas (centro de datos / empresa) de SQL Server admiten la agrupación y la replicación. Comenzaría construyendo un pequeño clúster y ejecutando algunas consultas para ver cómo funciona.
En el nivel de aplicación, si está haciendo "zonificación" o algo similar, probablemente pueda escapar sin configurar ningún clúster y simplemente configurar un servidor por zona. Si sus zonas se vuelven demasiado grandes, puede configurar un clúster para cada zona.
Deberá crear un proceso de serialización para enviar datos desde el nivel de aplicación -> nivel de base de datos. La clave es tener múltiples niveles de serialización en curso. Algo como esto:
- Nivel 1: Guardar en DB cada X segundos, incluye datos críticos:
- Salud del jugador
- Artículos del jugador / pastillas
- Nivel 2: Guardar en DB cada 2X segundos, incluye datos medios:
- Ubicaciones de jugadores
- Ubicaciones de NPC
- Nivel 3: todo lo demás, con la menor frecuencia posible
Esto mantendrá tus escrituras consistentes y predecibles, dependiendo de la naturaleza de tu juego, podrías tener escrituras infrecuentes en la base de datos. La clave es darse cuenta de que si su servidor de aplicaciones fallaba, tendría que volver a conectarse desde el estado en su base de datos, por lo que serializar el inventario de jugadores cada 90 minutos podría molestar a los jugadores.
Para leer datos, querrá cargar tanto como sea posible en la memoria en el nivel de aplicación posible, luego asegurarse de que todo su código use este grupo de memoria, en segundo plano puede sincronizar el grupo de memoria con la base de datos. Como Joe señala, habrá momentos en los que necesitará transacciones "en tiempo real". Al serializar la mayoría de sus escrituras, aún debe tener suficiente E / S en su base de datos para realizar transacciones en tiempo real cuando sea necesario, suponiendo que haya suficiente hardware en el servidor / clúster de la base de datos.