2012-02-13 11 views
5

Ho un lavoro di lunga durata che aggiorna le migliaia di gruppi di entità. Voglio dare il via a un secondo lavoro in seguito che dovrà presupporre che tutti questi elementi siano stati aggiornati. Dato che ci sono così tanti gruppi di entità, non posso farlo in una transazione, quindi ho appena pianificato il secondo lavoro da eseguire 15 minuti dopo che il primo è stato completato con le code delle attività.Come sapere quando gli aggiornamenti al datastore di Google AppEngine HRD sono completi?

C'è un modo migliore?

È anche sicuro assumere che 15 minuti promettano che il datastore sia sincronizzato con le mie chiamate precedenti?

Sto utilizzando la replica alta.

Nei video IO di Google su HRD, forniscono un elenco di modi per gestire la coerenza finale. Uno di loro era "accettarlo". Alcuni aggiornamenti (come i post di twitter) non devono necessariamente essere coerenti con la prossima lettura. Ma hanno anche detto qualcosa come "hey, stiamo parlando solo di un paio di secondi prima che siano coerenti". Questo arco temporale è documentato altrove? È sicuro supponendo che aspettare 1 minuto dopo una scrittura prima di rileggere significherà che tutte le mie scritture pre-violistiche sono presenti nella lettura?

La menzione di che è al contrassegno 39:30 in questo video http://www.youtube.com/watch?feature=player_embedded&v=xO015C3R6dw

+0

Ho dato una risposta parziale qui sotto, ma puoi dare ulteriori informazioni su cosa esattamente stai cercando di fare? – mjaggard

+0

Fondamentalmente sto inserendo o aggiornando migliaia di entità. Quando il lavoro è completato, ho bisogno di applicare un rango agli oggetti. Quindi eseguo una query che seleziona tutti i record e li ordina per il campo che mi interessa del posizionamento. Quindi aggiorno i ranghi in un altro tipo di entità. Quel grado sarà ovviamente disattivato se le entità mancano dalla query. – user963263

risposta

0

Ho trovato questa dichiarazione:

Con coerenza eventuale, oltre il 99,9% delle vostre scritture sono disponibili per le query nel giro di pochi secondi.

in fondo a questa pagina: http://code.google.com/appengine/docs/java/datastore/hr/overview.html

Così, per la mia domanda, una possibilità 0,1% di non essere lì sulla prossima lettura è probabilmente OK. Tuttavia, ho intenzione di ridisegnare il mio schema per fare uso delle query degli antenati.

0

Non penso che ci sia alcun costruito in modo per determinare se gli aggiornamenti sono fatti. Ti consiglio di aggiungere un campo lastUpdated alle tue entità e di aggiornarlo con il tuo primo lavoro, quindi controlla il timestamp sull'entità che stai aggiornando con il secondo prima di eseguire ... una specie di modifica, ma dovrebbe funzionare.

Interessato a vedere se qualcuno ha una soluzione migliore. Un po 'sperano che lo facciano ;-)

0

Questo è automatico finché si ottengono entità senza modificare la coerenza in Eventuale. L'HRD mette i dati nella maggior parte dei server datastore pertinenti prima di tornare. Se chiami la versione asincrona di put, dovrai chiamare get su tutti gli oggetti Future prima di poter essere sicuro che sia completato.

Se tuttavia si sta eseguendo una query per gli articoli nel primo lavoro, non è possibile garantire che l'indice sia stato aggiornato.

Così, per esempio ...

Se si sta aggiornando una proprietà su ogni entità (ma non la creazione di qualsiasi entità), quindi il recupero di tutte le entità di questo tipo. È possibile eseguire una query solo per le chiavi seguita da un batch get (che è approssimativamente veloce/economico rispetto a una query normale) e assicurarsi di aver applicato tutti gli aggiornamenti.

D'altra parte, se si aggiungono nuove entità o si aggiorna una proprietà nel primo processo su cui si interroga il secondo processo, non c'è modo di esserne sicuri.

+0

Il mio primo processo aggiorna e crea nuove entità. Quindi non c'è modo di essere sicuri che le entità siano presenti in una chiamata immediata per leggere quegli stessi elementi dal datastore, non importa quanto tempo attendo per eseguire il 2 ° processo (15 minuti o 15 giorni)? – user963263

+0

Dipende da cosa intendi per "leggere" - se intendi "ottieni" allora sì, saranno sempre lì. Tuttavia se intendi "query" o "trova", allora no. È tuttavia possibile eseguire una query solo per le chiavi per ogni entità che è stata aggiunta, consentendo solo la seconda esecuzione del processo una volta che ogni entità aggiunta è presente in un risultato della query. – mjaggard

+0

Vuoi dire persistere o aggiornare 1000 di elementi e mantenere le loro chiavi in ​​memoria. Quindi, quando li rileggo tramite una query, assicurati che tutte le chiavi siano presenti nei risultati? Se sono presenti, i dati sono garantiti per essere sincronizzati con gli aggiornamenti eseguiti due secondi prima? Anche se questo è un approccio valido, ad un certo punto i miei 1.000 diventeranno 1.000.000 e vorrei stare lontano dal tenere tanti dati in memoria. In questo momento sto evitando quello usando i cursori e operando solo su pochi 100 elementi contemporaneamente. – user963263

Problemi correlati