2011-02-11 6 views
10

He hecho un par de años de desarrollo de servidores de juegos a gran escala en PHP. Un equilibrador de carga delega las solicitudes entrantes a un servidor en un clúster. En nombre de un mejor rendimiento, comenzamos a almacenar en caché todos los datos estáticos (esencialmente los objetos del modelo del mundo del juego) en cada una de las instancias de ese clúster, directamente en la memoria compartida de Apache, usando apc_store y apc_fetch.¿Qué es un buen análogo de Flask/Python/WSGI para las tiendas de memoria compartida PHP Apache como apc_store/apc_fetch?

Por una serie de razones, ahora estamos empezando a desarrollar un marco de juego similar en Python, utilizando el microframework Flask. A primera vista, la tienda de memoria de esta instancia es la única pieza que no parece traducirse directamente a Python/Flask. Actualmente estamos considerando ejecutar Memcached localmente en cada instancia (para evitar la transmisión de objetos modelo bastante grandes por cable desde nuestro clúster Memcached principal).

¿Qué podemos usar en su lugar?

Respuesta

2

[Cinco meses más tarde]

Nuestro marco de juego está hecho.

Al final, decidimos almacenar los datos estáticos en instancias de modelo sqlalchemy completamente inicializadas en cada servidor web. Cuando un servidor de juegos recién iniciado se está calentando, estas instancias se construyen primero al presionar un archivo MySQL compartido.

Dado que nuestras fábricas modelo se transfieren a un grupo de instancias, las instancias del modelo solo se deben construir una vez por implementación por servidor; esto es importante porque a nuestra escala, MySQL lloraría bajo cualquier tipo de carga continua. Logramos nuestro objetivo de no transmitir estos datos por cable al mantener las definiciones de los elementos lo más cerca posible de nuestro código de la aplicación: en el código de la aplicación en sí.

Ahora me doy cuenta de que mi pregunta original era ingenua, porque a diferencia de la pila LAMP, el servidor Flask sigue funcionando entre las solicitudes, la memoria del servidor es "memoria compartida", no hay necesidad de algo como APC para hacerlo . De hecho, cualquier cosa fuera del alcance del proceso de solicitud propio y Flask's threadsafe local store, se puede considerar "memoria compartida".

5

Creo que, incluso en este caso, es posible que desee considerar tener un sistema centralizado de almacenamiento de clave/valor en lugar de una serie de servidores independientes en cada servidor. A menos que su equilibrador de carga redireccione siempre a los mismos usuarios a los mismos servidores, podría ejecutar un caso en el que las solicitudes de un usuario se enruten a diferentes servidores cada vez para que cada nodo tenga que recuperar el estado del juego en lugar de acceder a él desde un caché compartido.

También la tensión de memoria en la que puede incurrir un almacén de clave/valor local en cada sistema podría ralentizar las demás funciones de su servidor de juego. Aunque eso depende en gran medida de la cantidad de datos que se almacenan en caché.

En general, el mejor enfoque sería ejecutar algunos puntos de referencia para ver qué tipo de rendimiento obtendría con un clúster de memcached y los tipos de objetos que está almacenando frente al almacenamiento local.

Dependiendo de otras características que desee de su tienda de llaves/valores, es posible que también desee buscar algunas alternativas como mongodb (http://www.mongodb.org /).

+0

Utilizo Membase centralizado para mi verdadero data store y Memcache centralizado para clave/valor efímero. Como mencioné en mi publicación, el punto es "evitar la transmisión de objetos modelo bastante grandes por cable desde nuestro clúster Memcached principal". Hacer este cambio en la memoria local en un juego anterior me dio un gran aumento de rendimiento. Todo el conjunto de datos estáticos para un juego como este tiene menos de 50 mb, por lo que el almacenamiento/carga no es un problema.Después de todo, vas a tener que sacarlo a la memoria local eventualmente; mucho mejor si está almacenado allí para comenzar :) –

+0

La premisa básica es que los datos que deben centralizarse deben estar centralizados y los datos que pueden enviarse a los servidores de aplicaciones (es decir, datos estáticos/mundiales del juego que son apátridas e idénticos en los nodos) debe ser empujado a los servidores de aplicaciones. –

+0

Lo siento, no puedo aceptar esta respuesta ya que ignora dos puntos importantes de mi búsqueda: [1] Solo estoy hablando de datos estáticos, y [2] ya uso Memcached centralizado. –

Cuestiones relacionadas