2009-03-09 18 views
10

Estoy trabajando en un juego multijugador y necesita una cola de mensajes (es decir, mensajes entrantes, mensajes salientes, sin duplicados ni mensajes eliminados, suponiendo que no haya desalojos inesperados de la memoria caché). Aquí están las colas basadas en memcache yo sepa:¿Cola de mensajes basada en Memcache?

aprendí el concepto de la cola de Memcache de this blog post:

Todos los mensajes se guardan con un entero como clave. Hay una clave que tiene la siguiente clave y otra que tiene la clave del mensaje más antiguo en la cola. Para acceder a ellos, el método de incremento/disminución se utiliza como atómico, por lo que hay dos teclas que actúan como bloqueos. Se incrementan, y si el valor de retorno es 1, el proceso tiene el bloqueo, de lo contrario, sigue incrementándose. Una vez que el proceso finaliza, el valor vuelve a 0. Simple pero efectivo. Una advertencia es que el número entero se desbordará, por lo que existe una lógica en el lugar que establece las claves utilizadas en 1 una vez que estamos cerca de ese límite. Como la operación de incremento es atómica, el bloqueo solo es necesario si se utilizan dos o más memorias de almacenamiento (para la redundancia), para mantenerlas sincronizadas.

Mi pregunta es, ¿hay un servicio de cola de mensajes basado en Memcache que se pueda ejecutar en App Engine?

Respuesta

9

Sería muy cuidadoso al usar el Google App Engine Memcache de esta manera. Tiene razón al preocuparse por los "desalojos inesperados de la memoria caché".

Google espera que utilice el almacenamiento en caché Memcache para datos y no almacenar ella. No garantizan guardar datos en el caché. Desde el GAE Documentation:

Por defecto, los elementos no caducan, aunque artículos pueden ser desalojados debido a la memoria presión.

Editar: Siempre hay Amazon's Simple Queueing Service. Sin embargo, esto puede no cumplir con los niveles de precio/rendimiento ya sea como:

  1. Habría la latencia de llamadas desde Google a los servidores de Amazon.
  2. Terminarías pagando dos veces por todo el tráfico de datos, pagando por dejar Google y pagar nuevamente para que entrara en Amazon.
+0

Supongo que la caducidad de los elementos en la memoria caché se basará en la inactividad, por lo que si la vida útil de la cola es como usted dice, probablemente esté bien. Aunque hay muchos calificadores en esa declaración, definitivamente necesitaría manejar los elementos perdidos en la cola. –

+0

También necesito usar una cola de mensajes con GAE, pero no tengo idea de cómo conectar los servicios de cola basados ​​en memcache mencionados anteriormente (MemcacheQ, gorrión, etc.) con GAE, ya que GAE solo admite Java y Python, así que lo haría gustaría saber alguna idea sobre eso. Además, ¿cuáles son los otros servicios de cola de mensajes que podemos utilizar con GAE, que no sea AmazonSQS? –

0

Hasta Google impliment un trabajo a la cola apropiada, por qué no utilizar el almacén de datos? Como han dicho otros, Memcache es solo un caché y podría perder elementos de cola (lo que sería ... malo)

El data-store debería ser lo suficientemente rápido para lo que necesita, simplemente tendría un modelo Job simple , que sería más flexible que Memcache ya que no está limitado a pares clave/valor

+0

Especialmente con los recientes problemas de rendimiento, no va a ser rentable. Bajo un uso intensivo, espero poner más de 1 millón de mensajes por día a través de esta cola. Sería más económico usar el servicio de cola de Amazon que el almacén de datos. – gravitation

+0

¡Ah, es justo! – dbr

1

Si está contento con la posibilidad de perder datos, por supuesto, adelante.Tenga en cuenta, sin embargo, que aunque Memcache generalmente tiene una latencia menor que el almacén de datos, como cualquier otra cosa, sufrirá si tiene una alta tasa de operaciones atómicas que desea ejecutar en un solo elemento. Esto no es un problema del almacén de datos, simplemente es un problema de tener que serializar el acceso.

En su defecto, Amazon SQS parece una opción viable.

4

He comenzado un simple Python Memcached cola, que podría ser útil: http://bitbucket.org/epoz/python-memcache-queue/

+0

Parece que recuerdo haber visto esta técnica antes, pero +1 para embalajes como este. – Joel

+0

Estoy tratando de hacer algo como esto aquí: https://github.com/nmmmnu/SimpleMessageQueue Sin embargo, sin bloqueo, es posible perder mensajes. desde el otro lado, si el candado nunca expira, toda la operación puede quedar atascada. si bloquea la caducidad, puede ocurrir un problema si está liberando el bloqueo. – Nick

Cuestiones relacionadas