2009-03-09 19 views
10

Sto lavorando a una partita multiplayer e ha bisogno di una coda di messaggi (ad esempio, messaggi in entrata, messaggi in uscita, senza duplicati o messaggi eliminati supponendo che non ci siano sgomberi della cache imprevisti). Qui ci sono le code memcache basati io sappia:Coda messaggi basata su Memcache?

ho imparato il concetto della coda memcache da this blog post:

Tutti i messaggi vengono salvati con un numero intero come chiave. C'è una chiave che ha la chiave successiva e una che ha la chiave del messaggio più vecchio nella coda. Per accedere a questi il ​​metodo di incremento/decremento viene usato come atomico, quindi ci sono due chiavi che fungono da blocchi. Vengono incrementati e, se il valore restituito è 1, il processo ha il blocco, altrimenti continua ad aumentare. Una volta che il processo è finito, riporta il valore a 0. Semplice ma efficace. Un avvertimento è che il numero intero sarà overflow, quindi c'è qualche logica in posto che imposta i tasti usati su 1 una volta che siamo vicini a quel limite. Poiché l'operazione di incremento è atomica, il blocco è necessario solo se vengono utilizzati due o più memcaches (per ridondanza), per mantenere quelli sincronizzati.

La mia domanda è, c'è un servizio di coda messaggi basato su memcache che può essere eseguito su App Engine?

risposta

9

Sarei molto attento a utilizzare Google App Engine Memcache in questo modo. Hai ragione a preoccuparti degli "sfratti di cache inaspettati".

Google si aspetta di utilizzare il memcache per caching dati e non memorizzazione esso. Non garantiscono di mantenere i dati nella cache. Dal GAE Documentation:

Per impostazione predefinita, gli elementi non scadono mai, anche se elementi possono essere sfrattati a causa di memoria pressione .

Edit: C'è sempre Amazon's Simple Queueing Service. Tuttavia, questo potrebbe non soddisfare i livelli di prezzo/prestazioni come:

  1. Ci sarebbe la latenza della chiamata dai server di Google ad Amazon.
  2. Si finirebbe per pagare due volte per tutto il traffico dati - pagando per lasciare Google e poi pagare di nuovo per andare in Amazon.
+0

Mi aspetto che la scadenza degli elementi nella cache sia basata sull'inattività, quindi se la vita della coda è come dici tu probabilmente starai bene. Sebbene ci siano molte qualificazioni in questa affermazione, devi assolutamente gestire gli oggetti persi in coda. –

+0

Devo anche usare una coda messaggi con GAE, ma non ho idea su come collegare i servizi di coda basati su memcache sopra menzionati (MemcacheQ, sparrow ecc.) Con GAE, poiché GAE supporta solo Java e Python, quindi vorrei piace conoscere qualsiasi idea su di esso. Inoltre, quali sono gli altri servizi di coda dei messaggi che possiamo utilizzare con GAE, ad eccezione di AmazonSQS? –

0

Fino a quando Google non implimenta una coda di lavoro adeguata, perché non utilizzare il data-store? Come altri hanno già detto, memcache è solo una cache e potrebbe perdere elementi di coda (che sarebbe .. cattivo)

Il data-store dovrebbe essere più che abbastanza veloce per quello che ti serve - avresti solo un semplice modello di lavoro , che sarebbe più flessibile di memcache in quanto non sei limitato a coppie chiave/valore

+0

Soprattutto con i recenti problemi di prestazioni, non sarà redditizio. Con un uso intenso, mi aspetto di mettere> 1 milione di messaggi al giorno attraverso questa coda. Sarebbe più economico utilizzare il servizio di coda Amazon rispetto al datastore. – gravitation

+0

Ah, abbastanza giusto! – dbr

1

Se sei soddisfatto della possibilità di perdere dati, con tutti i mezzi andare avanti.Tenete a mente, tuttavia, che sebbene memcache abbia generalmente una latenza inferiore a quella del datastore, come qualsiasi altra cosa, ne risentirà se si ha un alto tasso di operazioni atomiche che si desidera eseguire su un singolo elemento. Questo non è un problema di archivio dati: è semplicemente un problema di serializzazione dell'accesso.

In caso contrario, SQS di Amazon sembra un'opzione valida.

4

ho iniziato una semplice Python Memcached coda, potrebbe essere utile: http://bitbucket.org/epoz/python-memcache-queue/

+0

Mi sembra di ricordare di aver visto questa tecnica prima, ma +1 per il packaging come questo. – Joel

+0

Sto cercando di fare qualcosa del genere qui: https://github.com/nmmmnu/SimpleMessageQueue tuttavia, senza il blocco, c'è un po 'possibile perdere i messaggi. dall'altra parte, se il blocco non scade mai, l'intera operazione potrebbe bloccarsi. se si blocca la scadenza, può succedere che si verifichi un disastro se si rilascia il blocco. – Nick

Problemi correlati