Pregunta

Mi objetivo es crear un juego de navegador donde los jugadores puedan configurar edificios.

Cada edificio tendrá varios módulos (motores, oficinas, líneas de producción, ...). Cada módulo tendrá en realidad una o más acciones en ejecución, como la creación de 2oo 'Elemento X' con ingredientes Y, Z.

El servidor de juegos se configurará con Erlang: una aplicación OTP como servidor en sí y nitrógeno como frente web. Necesito persistencia de datos. Estaba pensando en lo siguiente:

Cuando alguien o algo interactúa con un edificio, o un temporizador que representa una línea de producción termina, un supervisor genera un gen_server (si aún no se está generado) que carga el estado del edificio desde una base de datos, por lo que el Gen_Server puede responder mensajes como 'Agregar' Añadir) Este módulo ',' inicia esta acción ',' almacena esta producción en el almacén ',' morir ', etc. (

Pero cuando un edificio no recibe ningún mensaje durante x segundos o minutos, terminará (gracias a la función Gen_Server TimeOut) y dejará caer su estado actual a la base de datos.

Entonces, como será un juego (suave) en tiempo real, el Gen_Server debe configurarse muy rápidamente. Estaba pensando en Membas como la base de datos, porque se sabe que tiene muy buen tiempo de respuesta.

Mi pregunta es : Cuando un servidor de Gen está en funcionamiento, sus estados llenan algo de memoria, y este estado está presente en la memoria manejada por Membase también, por lo que el estado usa dos veces su tamaño en la memoria. ¿Es ese un mal diseño?

¿Es Membas una buena solución para manejar la persistencia en mi caso? ¿Usaría la mnesia una mejor opción o algo más?

Temo el límite del tamaño de la tabla de Mnesia 2 Go (o 4?) Porque no sé en este momento el tamaño promedio de estado de mis servidores gen_ (edificios en este ejemplo, jugadores de mayo, líneas de producción, lo que sea) y es posible que algún día tenga más 1 jugador :)

Gracias

¿Fue útil?

Solución

Estoy de acuerdo con Hynek -Pich- Vychodil. Riak es una gran cosa para el almacenamiento de valores clave.

Usamos RIAK casi 95% para lo mismo que describiste. Todo funciona hasta ahora sin ningún problema. En caso de que alcance la limitación de rendimiento de RIAK, ¡agregue más nodos y es bueno que se avance!

Otra cosa genial de Riak es su degradación de muy bajo rendimiento con el tiempo. Puede encontrar más información sobre Benchmarking Riak aquí: http://joyeeur.com/2010/10/31/riak-smartmachine-benchmark-the-technical-details/

En caso de que lo vayas:

Sobre el uso de membase y memoria: también probé Membase, pero descubrí que no es adecuado para mis tareas: (Membase declara la tolerancia a fallas, pero no podría configurarlo en la forma en que debería funcionar con fallas, incluso con la ayuda de Membase Guys No tuve éxito). Entonces, en este momento uso la siguiente arquitectura: todos los jugadores que están en línea y el juego se presentan como procesos de jugadores (gen_server). Todos los datos de datos y la lógica comercial para cada jugador están en su proceso de reproductor. De vez en cuando, cada proceso de jugador se encuentra para salvar su estado en Riak.

Hasta ahora parece ser un enfoque muy rápido y eficiente.

ACTUALIZACIÓN: Ahora estamos con PostgreSQL. ¡Es asombroso!

Otros consejos

Puedes mirar tarta de bits u otro Riak Backends para almacenar sus datos. Evite que IPC sea definitivamente una buena idea, así que mantenlo dentro de Erlang.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top