2011-11-29 18 views
24

Ho ricevuto un nuovo requisito dall'azienda circa "in tempo reale" dati/statistiche. Vogliono mostrare come il nostro sistema si sta comportando in tempo reale.cronjob non-stop

non sono sicuro come farlo, ma qui sono i miei pensieri:

non credo sia possibile ottenere i dati ogni secondo perchè run cronjob almeno ogni minuto. Quindi, senza dirglielo, ho detto SI è possibile.

Ora il mio problema è questo come posso eseguire un cronjob che ottiene statistiche sui nostri siti (vendite, impression, cpc ecc ...)?

Esempio:

Da 9h01 del mattino alle 9h02 AM ho:

  • 41 opinioni sul prodotto 1
  • 1 ordine
  • 8 rinvio click da parte dei clienti
  • 2 aggiunti alla lista dei desideri

Da 9h02 del mattino alle 9h03 AM ho:

  • 57 opinioni sul prodotto 1
  • 0 ordine
  • 13 rinvio click da parte dei clienti
  • 0 aggiunti alla lista

totale :

  • 98 visualizzazioni su prodotto 1
  • 1 ordine
  • 21 rinvio click da parte dei clienti
  • 2 aggiunto alla lista dei desideri

Come posso fare in modo che non calcolerà duplicati se per qualche motivo il database è lento e non viene elaborato informazioni in tempo?

Grazie

Edit: L'azienda ha 200 dipendenti in 3 diversi stati che si compone di vendite, business analyst, tecnologia, contabilità, e personale esecutivo e queste persone in grado di leggere questi rapporti.

Nell'ultimo anno abbiamo assunto 20 dipendenti, quindi crescerà un po '. Per i dati sul traffico, è difficile stabilire esattamente la quantità di dati che otteniamo al minuto. La stima è di circa 2,5k a 10k al minuto.

Abbiamo appena ordinato 3 PowerEdge R510 (Intel® Xeon® E5503, 2,0 Ghz, 4 M Cache, 12 GB di memoria (3x4 GB), 1333 MHz Dual Rank, 4 x 300 GB 15K RPM Serial-Attach SCSI 6 Gbps RAID 5).

+0

quanti utenti hai e cresceranno? quanti dati ottieni al minuto? Che tipo di server hai (quanto, velocità, hdd, memoria)? –

+0

ho aggiornato la mia risposta grazie –

+0

grazie per l'aggiornamento –

risposta

30

Ecco cosa consiglio in base ai server/dipendenti/dati se questi server sono. Poiché si sta utilizzando 1 server (e 1 backup), la capacità dell'unità dovrebbe essere sufficiente per un po ', a meno che non si desideri archiviare dati completi su questo server. I dati possono crescere rapidamente e io penserei di aumentare la capacità o archiviare i dati da qualche altra parte.

Ora, poiché ci sono molte persone che possono richiedere i dati di reporting, l'idea principale è quella di recuperare i dati il ​​più velocemente possibile per assicurarsi di non bloccare i record (specialmente se si utilizzano tabelle myisam - table locking vs innodb che ha il blocco a livello di riga).

Usa il tuo indice (unico se necessario) con saggezza e conserva i tuoi dati nel modo più efficiente possibile utilizzando il timestamp.

Quello che puoi fare è anche riassumere i tuoi dati che possono semplificare le tue domande. Anche se, non è una pratica comune nei database poiché non rispetta le forme normali. Puoi ottenere grandi prestazioni, ma è un problema da mantenere.

Per essere onesti, un cron eseguito ogni minuto va bene poiché si ha il tempo in cui si salva il record ma è possibile ottenere dati ogni secondo. Ti consiglio di assicurarti che quando ricevi un record, contrassegni questo record come "elaborato" o in qualche altro stato in modo che tu non prenda questo record due volte.

Ora, quando riepilogate i vostri dati, assicuratevi di ottimizzare le vostre domande e potete anche controllare che cosa emetterà l'explain e poi prendere una decisione.


EDIT: dati che sintetizzano (che non rispettano la normalizzazione del database) si arriva grandi prestazioni dal momento che solo i record di query senza l'utilizzo di funzioni di aggregazione e avendo unisce le tabelle utilizzando il minimo in cui clausola.

Esempio:

98 views on product 1 
1 order 
21 referral click from clients 
2 added to wishlist 

può essere:

SELECT 
views, orders, referral, whishlist 
FROM 
summarize_stats_20111201 /* daily table for example */ 
WHERE 
`time` between 1322791200 /*2011-12-01 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/; 

views ha la quantità totale di visualizzazioni, in questo esempio 98

orders ha la quantità totale di ordini, in questo esempio 1

referral ha il Tal quantità di riferimento, in questo esempio 21

wishlist ha la quantità totale di lista dei desideri, in questo esempio 2

Questi dati sono calcolati in una tabella riassuntiva (questo è il motivo per cui ho detto "non rispetta la normalizzazione dei database "perché non si calcolano mai i dati in un RDBMS), ma se hai bisogno di dati istantaneamente, questo è un modo per farlo.


EDIT 2: Ecco un esempio di mantenimento di questa soluzione:

Si dispone di un cronjob che mantiene le tabelle. Il suo compito è quello di creare il tavolo per il giorno dopo o quello che ti serve.

// in php 
$date = date('Ymd', strtotime('+1 day')); // for daily table 
$sql = 'CREATE TABLE IF NOT EXISTS the_database.summarize_stats_" . $date . "; 

Quindi, quando si inserti, assicurarsi di avere il nome della tabella a destra e si utilizza ON DUPLICATE KEY

// in php 
$sql = 'INSERT INTO TABLE summarize_stats_20111201 SET /* all the fields you need */ ON DUPLICATE KEY views = views + 1; 

per esempio, se si desidera aumentare la vista

Quello che ho anche dimenticare è se è necessario interrogare 1 settimana di dati, sarà necessario creare una tabella merge. In questo modo si può fare qualcosa di simile:

SELECT 
views, orders, referral, whishlist 
FROM 
summarize_stats_2011 /* yearly merge table for example */ 
WHERE 
`time` between 1322272800 /*2011-11-25 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/; 

In questo modo non c'è bisogno di UNION ALL tonnellate di query.

+0

grazie per questa risposta, che mi aiuti. e sì lo so, ho un budget limitato. puoi per favore approfondire: i tuoi "riepiloghi dati" –

+0

Ho aggiornato la mia risposta –

+0

beh non mi interessa davvero se non è una pratica comune, ho bisogno di essere veloce. come si mantiene questo? –

2

Salva nel database il timestamp dei record, e valutare i dati in base ad esso (per mysql http://dev.mysql.com/doc/refman/5.0/en/timestamp.html)

+0

È possibile utilizzare fat-controller.sourceforge.net per eseguire processi al secondo o ripetere continuamente un lavoro una volta terminato, ma penso che in questo caso sarebbe molto, molto meglio fare come de3 giorni e data/ora dei dati e quindi solo gruppo e aggregarlo usando SQL. – SlappyTheFish

+0

Questo. È necessario avere un timestamp dello stato dell'ultima modifica dei dati. In caso contrario, qualsiasi ritardo tra la modifica dello stato dei dati e il momento in cui viene recuperato ha causato risultati inaccurati. Il modo in cui lo si archivia dipende in realtà dalle funzionalità e dallo schema corrente del DB. Hai qualche controllo che potresti sfruttare per questo? – Steven

0

Gino, si può fare qualcosa di simile cronjobs se si ha accesso al vostro php.ini sul server . Se è possibile impostare il valore di max_execution_time su zero, è possibile creare cronjob personalizzati che vengono eseguiti ogni secondo. Quello che vi serve è qualcosa di simile nel tuo php.ini:

max_execution_time = 0 

o impostarla come uno script runtime nei vostri codici PHP:

ini_set("max_execution_time",0); 

La prossima funzione che si ha bisogno, è il sonno() funzione in PHP. Questa funzione metterà un ritardo tra le tue operazioni. Puoi usarlo come sleep(10);. Per ulteriori informazioni su questa funzione, dare un'occhiata a this link.

+3

non penso che questo sia buono da fare. sleep (10)? su un sito ad alto traffico? – aki

+0

Aki, questo suggerimento è solo per quelle applicazioni che sono in esecuzione su un server privato. Altrimenti, non puoi utilizzare anche max_execution_time. –

0

Questo potrebbe sembrare strano, ma perché non si utilizza Google Analytics per questo tipo di attività di monitoraggio. Con il nuovo "live beta"

E recuperare i dati utilizzando il suo API ed eseguire tutti i requisiti di fantasia che la gestione potrebbe richiedere.

Più js e google gestiranno la maggior parte del carico.

modifica: Il mio vero punto è perché non provi a usare il js (woopra o il tuo) per raccogliere i clic, gli eventi sul front-end e memorizzare tutte le statistiche su un altro database, non credo mixare OLAP e OLTP è una buona idea su qualsiasi server di produzione. Spero che abbia un senso.

+2

Può google analytics filtra i dati per minuti? –

+0

Credo che no, la versione beta live non è ancora disponibile nelle aree API a meno che Google non abbia aggiornato la documentazione, quindi l'opzione di filtro minimo è ancora al livello Ora. Ho anche aggiornato la mia risposta. – Will

Problemi correlati