Estoy trabajando en un juego multijugador en tiempo real que requerirá una base de datos (para funciones como perfiles de jugadores, amigos, desbloqueos, noticias, etc.). Es un juego estándar para PC (no basado en navegador) y utilizará un servidor cliente. arquitectura. Soy nuevo en el uso de bases de datos, y he investigado durante los últimos días cuando me topé con el acalorado debate: RDBMS vs NoSQL. Actualmente me estoy inclinando hacia NoSQL pero después de leer sobre los usos de cada uno (RDBMS y NoSQL), estoy tentado a usar ambos. Sé que puede parecer extraño, pero déjame explicarte mi situación:
Mi equipo tiene un paquete de alojamiento web compartido que ofrece almacenamiento ilimitado de mySQL y ancho de banda, la única advertencia es que solo podemos tener 25 conexiones abiertas al mismo tiempo (regla de alojamiento compartido). Tengo la intención de usar esto para mi sitio web (un uso típico sin duda) para publicar actualizaciones de noticias, funciones de soporte de la comunidad (como comentarios, subir fan art, etc.) y similares. Eso está bien y bien, ¡pero! Aquí es donde las cosas se ponen interesantes ... Quiero mostrar esta misma información que está publicada en mi sitio web, en el juego. Esto significa usar mySQL tanto para mi sitio web como para mi juego. Además de las publicaciones de noticias y similares, planeo usarlo en el juego para cosas como el chat y una lista de servidores. Me preocupa sobre todo esa regla de 25 conexiones.
Lo que me lleva a hacer la Pregunta # 1: ¿Funcionará y hay una mejor alternativa?
Ahora, además de esto, he leído sobre qué tan bien funciona NoSQL y es adecuado para juegos en tiempo real (podría estar equivocado, he atravesado una gran guerra de llamas RDBMS vs NoSQL para llegar aquí y probablemente estoy quemado). Básicamente, me gustaría usar MongoDB para todos mis datos de objetos de juego.
And again, it will be helpful if I provide some context: I have found a host (MongoLab) which offers a 240MB MongoDB package for free, which I intend on using until it's necessary to upgrade. Given 240MB, I've calculated that I will be able to store roughly 60,000 players (if each player is roughly 4KB and we ignore other things that might be stored). The storage space, and having to pay for more in the future (should our game be successful) is not a problem. The only reason I currently intend on using MongoDB for all of my game object data is because of how often this game object data will be accessed (such as whenever a player is killed, picks up an item, fires a gun, etc.) I also like the straight forward schema-free documents (which make it easier to map game object data). I should note that, at one time, there will only ever be one server writing to a player's profile in the database (the server the player is in).
Tengo la intención de usar el mismo MongoDB en mi sitio web, para mostrar la información del perfil del jugador (no me preocupa la consistencia completa, está bien algún retraso por las actualizaciones en el juego). Lo que me lleva a mi segunda pregunta, Pregunta # 2: ¿Es una buena idea o hay algo mejor que debería hacer?
El juego tendrá una experiencia de inicio similar a esta:
- El cliente inicia sesión (MongoDB)
- El cliente está en la página de inicio del juego con salas de chat (MySQL)
- El cliente va a la lista de servidores (MySQL)
El cliente se conecta a un servidor y juega en él
El servidor comunica actualizaciones para todos los jugadores (MongoDB)
Así es como me imaginaba que funcionaría. ¿Le parece bien o tiene sugerencias sobre cómo se puede mejorar este plan?
Respuestas:
Mi sugerencia es que su juego se comunique con un servicio web que creó que se ocupa de consultar la base de datos. En ese punto, es muy simple probar diferentes tipos de bases de datos al "cambiar" las implementaciones de servicios web (la interfaz de su servicio web siempre permanece igual para que su juego no se rompa) y decidir cuál es el adecuado para usted.
También es mucho más seguro no exponer su base de datos a Internet directamente.
fuente
Eso es más que suficiente para tu juego. El problema es que si su sitio web utiliza múltiples conexiones, podría quedarse sin él. Debes configurar tu servidor web para usar solo un pequeño número de ellos, dejando el resto para tu servidor de juegos. Su servidor de juegos realmente no necesita más de 1 conexión, pero podría beneficiarse de tener un puñado.
Es un argumento un poco falso, porque ninguno de los sistemas es lo suficientemente rápido como para usarlo como la tienda principal para un juego en tiempo real de ritmo rápido; realmente necesitas mantener y manipular los valores en la memoria. Por lo tanto, solo accede a la base de datos cuando es absolutamente necesario, lo que podría ser guardar el personaje completo de vez en cuando (por ejemplo, una vez por minuto), momento en el que las diferencias de velocidad se vuelven insignificantes.
Lo curioso es que si ajusta MongoDB para obtener la máxima velocidad, puede llegar a un punto en el que sería lo suficientemente rápido como para realizar escrituras sincrónicas desde un juego de ritmo razonablemente rápido, pero esto sería a costa de integridad de datos porque las escrituras están almacenadas en búfer. Esto significa que pierde esos datos en el caso de un bloqueo, por lo que no tenía sentido realizar la escritura, y todavía es más lento que si solo realizara la edición en la memoria y la guardara más tarde, por lo que obtiene lo peor de ambos mundos .
Pregúntese por qué necesita escribir en la base de datos cuando un jugador dispara un arma. ¿Por qué no se puede manejar eso en memoria en el servidor del juego? Si su juego falla y luego se reinicia, y el jugador descubre que tiene 3 balas más de lo que esperaban, ¿es un problema comercial crítico?
Esta es una razón mucho mejor para elegir un enfoque NOSQL que el problema de rendimiento.
Eso está bien y es sensato. Más adelante, es posible que desee utilizar una instancia separada, para que las lecturas web no compitan con las lecturas y escrituras de juegos, pero ese problema es trivial de resolver en comparación con el problema de hacerse lo suficientemente popular como para que esto sea un problema.
Personalmente, solo elegiría una de las dos bases de datos, en función de cuál sería menos trabajo para mí, y estandarizaría eso, pero no hay ninguna razón por la que no pueda quedarse con dos si lo desea.
fuente
Todos los datos en tiempo real deben mantenerse en la memoria de la aplicación, cualquier otra cosa sería una tontería.
Mantener los datos de inicio de sesión de los usuarios, las estadísticas, etc. es una tarea bastante ligera, por lo que seré valiente y diré que puedes usar casi lo que quieras. Aunque es posible que desee tener cuidado con el sitio web, cosas como las listas de usuarios podrían absorber mucho rendimiento de la base de datos si no crea un sistema de almacenamiento en caché adecuado.
Y como dijo bummzack, debes mantener todo en la misma red. Además de eso, tenga cuidado con las cosas gratis, 240 MB de almacenamiento gratuito de la base de datos suena bien, pero dado que la máquina probablemente se divide entre una gran cantidad de usuarios gratuitos, el servicio podría ser bastante lento.
fuente
¿Confía en sus 60,000 usuarios por base de datos? De lo contrario, debe rechazar la idea de "acceso a la base de datos del cliente", a menos que su nivel de experiencia en la seguridad del software de la base de datos sea de primera categoría y esté seguro de que puede resolver cualquier problema que pueda surgir.
fuente