Domanda

Sto sviluppando software utilizzando il motore dell'app di Google.

Ho alcune considerazioni sulla progettazione ottimale per quanto riguarda il seguente problema: ho bisogno di creare e salvare istantanee di alcune entità a intervalli regolari.

nel convenzionale mondo db relazionale, creerei lavori db che inseriscano nuovi record di riepilogo.

ad esempio, un lavoro inserisce un record per ogni utente attivo che conterrebbe il suo punteggio corrente nella sezione "uso" tabella, diciamo, ogni ora.

Mi piacerebbe sapere qual è il metodo migliore per raggiungere questo obiettivo nel motore di app di Google. So che esiste il servizio Cron, ma ci consente di eseguire lavori che inseriranno / aggiorneranno migliaia di record?

È stato utile?

Soluzione

Hai preso in considerazione l'utilizzo di api remoto ? In questo modo è possibile ottenere una shell per il proprio archivio dati ed evitare i timeout. La classe Mapper che dimostrano in quel link è abbastanza utile e l'ho usata con successo per fare operazioni batch su ~ 1500 oggetti.

Detto questo, anche cron dovrebbe funzionare bene. Hai un limite di tempo per ogni singola richiesta, quindi non puoi semplicemente esaminarle tutte in una volta, ma puoi usare il reindirizzamento per scorrere tutti gli utenti che vuoi, elaborando un utente alla volta. Dovrebbe esserci un esempio di questo nei documenti da qualche parte se hai bisogno di aiuto con questo approccio.

Altri suggerimenti

Penso che scoprirai che lo snapshot dello stato di ogni utente ogni ora non è qualcosa che si ridimensionerà bene indipendentemente dal tuo framework. Un ambiente più ordinario camufferà ciò consentendoti di svolgere attività più lunghe, ma raggiungerai comunque il punto in cui non è pratico scattare un'istantanea dei dati di ogni utente, ogni ora.

Il mio suggerimento sarebbe questo: aggiungi un campo 'last snapshot' e subclassa la funzione put () del tuo modello (supponendo che tu stia usando Python; lo stesso è possibile in Java, ma non conosco la sintassi ), in modo tale che ogni volta che aggiorni un record, controlla se è trascorsa più di un'ora dall'ultima istantanea e, in tal caso, crea e scrive un record di istantanee.

Per evitare che gli aggiornamenti simultanei creino due istantanee identiche, ti consigliamo di assegnare alle istantanee un nome chiave derivato dal momento in cui è stata scattata l'istantanea. In questo modo, se due aggiornamenti simultanei provano a scrivere un'istantanea, uno sovrascriverà innocuo l'altro.

Per ottenere lo snapshot per una determinata ora, è sufficiente eseguire una query per lo snapshot più vecchio più recente del periodo richiesto. Come bonus aggiuntivo, dal momento che i record inattivi non sono istantanei, stai risparmiando anche molto spazio.

Vorrei utilizzare una combinazione di processi Cron e un metodo di recupero dell'URL in loop qui dettagliato: http: // stage.vambenepe.com/archives/549 . In questo modo puoi prendere i tuoi timeout e iniziare un'altra richiesta.

Per riassumere l'articolo, il cron job chiama il processo iniziale, si rileva l'errore di timeout e si richiama nuovamente il processo, mascherato come un secondo URL. Devi eseguire il ping tra due URL per impedire al motore dell'app di pensare di essere in un ciclo accidentale. Devi anche stare attento a non eseguire il loop all'infinito. Assicurati che ci sia uno stato finale per il tuo ciclo di aggiornamento, dal momento che questo ti metterebbe sulle tue quote abbastanza rapidamente se non finisse mai.

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