2011-11-11 17 views
7

Ho riscontrato problemi con il datastore del motore dell'app Google. Da quando è stato introdotto il nuovo modello di pricing, il costo di esecuzione della mia app è aumentato in maniera massiccia.Operazioni di archivio dati eccessive di piccole dimensioni del motore di app di Google

Il colpevole sembra essere "le piccole operazioni di Datastore", che arrivano a più di 20 milioni di operazioni al giorno!

Qualcuno ha avuto questo problema, non penso che sto facendo un numero eccessivo di ricerche chiave e ho solo 5000 utenti, con circa 10 - 20 richieste al minuto.

Grazie in anticipo!

Modifica

Ok ottenuto alcune statistiche, questi sono dopo intestano tre ore. Ecco quello che sto vedendo nel mio cruscotto, nella sezione di fatturazione: Appengine dashboard - billing

e qui ci sono alcune delle statistiche:

Stats

Ovviamente ci sono un sacco di chiamate a datastore.get . Sto iniziando a pensare che sia il mio design a causare il problema. Quelli si corrispondono ai conti. Ogni utente ha un account, ma un account può essere uno di due tipi, per questo io uso la composizione. Quindi ogni entità contabile ha un link alla sua entità subaccount. Di conseguenza, quando eseguo una ricerca per utenti vicini, è necessario recuperare gli account utilizzando la query e quindi eseguire un get su ciascun account per ottenere il proprio account secondario. La prima richiesta nell'immagine delle statistiche è una chiamata che riceve 100 account e quindi deve fare un get su ognuno di essi. Avrei pensato che si trattava di una domanda molto leggera, ma immagino di no. E sono ancora confuso dal numero di piccoli ops datastore registrati nella mia dashboard.

+1

Per curiosità, qual è stata la fattura mensile tipica prima e dopo? – Dave

+0

La mia quota giornaliera era di $ 2, e non l'ho mai colpito. Ora costa $ 5 dollari e lo sto superando ogni giorno. Penso che dovrei aumentare a $ 9 al giorno. – Theblacknight

+0

Scusa, avrei dovuto chiederglielo, ma stai usando memcache? – Dave

risposta

11

Utilizzare sicuramente appstats come suggerisce Drew; indipendentemente da quale libreria stai usando, ti dirà quali operazioni stanno facendo i tuoi gestori. I colpevoli più probabili sono le query solo sulle chiavi e le operazioni di conteggio.

+1

Spot on here, Devo fare una normale operazione di sincronizzazione, e ho ottenuto un conteggio totale degli utenti per ogni sincronizzazione. Quindi sto memorizzando la cache ora e posso vedere la differenza. Saluti! – Theblacknight

9

Il mio consiglio sarebbe quello di utilizzare AppStats (Python/Java) per tracciare il profilo del traffico e capire quale gestore sta generando le operazioni più datastore. Se pubblichi qui il codice, possiamo potenzialmente suggerire ottimizzazioni.

+0

Conosco la maggior parte del mio traffico e sto utilizzando "Siena", una libreria java che funziona con GAE. Passerò attraverso il mio codice e proveremo a selezionare frammenti che potrebbero essere utili. – Theblacknight

+0

AppStats è impostato, aggiornerà il mio post originale quando avrò più informazioni. Grazie. – Theblacknight

1

Non eseguire la scansione del datastore, utilizzare get (chiave) o get_by_id (id) o get_by_key_name (keyname) il più possibile.

1

Avete molte proprietà ReferenceProperty nei vostri modelli? Accedendoli, attiverai db.get per ogni proprietà a meno che non li precarichi. Questo innescherebbe 101 richieste db.get.

class Foo(db.Model): 
    user = db.ReferenceProperty(User) 

foos = Foo.all().fetch(100) 
for f in foos: 
    print f.user.name # this triggers db.get(parent=f, key=f.user) 
+0

Con l'API java che sto usando, ho bisogno di ottenere manualmente ogni proprietà a cui si fa riferimento in un'altra entità. Cercando di recuperare in lotti ora, per vedere se questo mi dà la spinta di cui ho bisogno. – Theblacknight

+0

Controlla questo post di blog che ho scritto, la parte di prefetching: http://bravenewmethod.wordpress.com/2011/03/23/developing-on-google-app-engine-for-production/ –

Problemi correlati