Domanda

La mia applicazione ha bisogno di fare molte operazioni datastore su ogni richiesta. Mi piacerebbe correre in parallelo per ottenere tempi di risposta migliori.

Per aggiornamenti datastore che sto facendo mette in batch in modo che tutto ciò accada in modo asincrono che consente di risparmiare molti millisecondi. App Engine permette fino a 500 entità essere aggiornato in parallelo.

Ma non ho trovato una funzione built-in che permette datastore recupera di diversi tipi di eseguire in parallelo.

Dal App Engine non consente UrlFetch chiama per eseguire in modo asincrono , ho creato un URL getter per ogni tipo che restituisce i risultati della query come testo in formato JSON. Ora la mia app può fare asincrona UrlFetch chiama a questi URL che potrebbero parallelizzare il datastore recupera.

Questa tecnica funziona bene con un piccolo numero di richieste parallele, ma App Engine genera errori quando si tenta di eseguire più di 5 o 10 di questi UrlFetch chiamate allo stesso tempo.

Sono solo testando ora, in modo che ogni UrlFetch è la query identica; dal momento che funzionano bene in piccoli volumi, ma non riuscendo iniziano con più di una manciata di richieste simultanee, sto pensando che deve avere qualcosa a che fare con l'asincrono UrlFetch chiama.

Le mie domande sono:

  1. C'è un limite al numero di urlfetch.create_rpc () chiamate che possono funzionare in modo asincrono?
  2. La funzione urlfecth.fetch sincrona () ha un parametro di 'scadenza' che permetterà la funzione di attendere fino a 10 secondi per una risposta prima di guastarsi. C'è un modo per dire urlfetch.create_rpc () il tempo di attesa per una risposta?
  3. Che cosa gli errori riportati di seguito significa?
  4. C'è una tecnica lato server meglio correre datastore recupera di diversi tipi in parallelo?

    File "/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", la linea 501, in get_result     tornare self .__ get_result_hook (auto)   File "/base/python_lib/versions/1/google/appengine/api/urlfetch.py", la linea 331, in _get_fetch_result     aumentare downloadError (str (err)) InterruptedError: ( 'The Wait () richiesta è stata interrotta da un'eccezione da un altro richiamo:', downloadError ( 'ApplicationError: 5',))

È stato utile?

Soluzione

Dal App Engine consente di effettuare chiamate asincrone UrlFetch ma non consente asincrona datastore ottiene, stavo cercando di usare UrlFetch RPC per recuperare dal datastore in parallelo.

La mancanza di async datastore ottiene è un problema riconosciuto:

http://code.google.com/p/googleappengine / temi / dettaglio? id = 1889

E c'è ora uno strumento di terze parti che consente query asincrone:

http://code.google.com/p/asynctools/

"asynctools è una libreria che consente di eseguire chiamate API di Google App Engine in parallelo. Chiamate API possono essere mescolati insieme e in coda e poi tutti sono preso il via in parallelo".

Questo è esattamente quello che stavo cercando.

Altri suggerimenti

Mentre temo che non posso rispondere direttamente una delle domande che si pongono, penso che dovrei dirvi che tutte le vostre ricerche in questo senso, non può portare a voi per una soluzione di lavoro per il vostro problema .

Il problema è che datastore scrive vuole molto più lungo di legge, quindi se si trova un modo per massimo il numero di letture che può succedere, tu sei il codice sarà molto corto di molto tempo prima che sia in grado di fare corrispondente scrive a tutte le entità che avete letto.

Vorrei seriamente in considerazione ripensare la progettazione delle classi datastore per ridurre il numero di letture e le scritture che deve accadere, in quanto questo sarà presto diventare un collo di bottiglia per la vostra applicazione.

Hai pensato di usare code di attività per fare il lavoro di accodare la richieste da eseguire in seguito?

Se l'attività restituisce uno stato 4xx sarà considerato fallito e verrà ritentata successivamente - in modo da potrebbe passare l'errore back up e hanno la coda compito maniglia di riprovare le richieste fino al successo. Inoltre, con un po 'di sperimentazione con i formati a tazze e tariffe, probabilmente si può avere la coda Task rallentare le richieste abbastanza che non si max fuori il database

C'è anche un bel involucro (deferred.defer) che rende le cose ancora più semplice -. È possibile effettuare una chiamata differita (quasi) tutte le funzioni nella vostra applicazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top