Domanda

L'azienda per cui lavoro crea applicazioni per la piattaforma Blackberry.

Abbiamo lavorato su un "sistema di analisi" proprietarie che ci permette di incorporare il codice all'interno delle nostre applicazioni e hanno le applicazioni di riferire alcune statistiche ai nostri server centrali ogni volta che sono eseguiti. Attualmente, il sistema funziona bene; tuttavia è solo in versione beta con 100-200 colpi all'ora. I "colpi" vengono inviati ai server senza un problema. Abbiamo costruito un API molto solida per gestire l'accettazione e lo stoccaggio dei colpi (in un DB MySQL). Abbiamo testato il carico e dovremmo essere in grado di accogliere centinaia di migliaia di visite ogni ora senza un problema. Questo non è davvero un problema.

Il problema sta mostrando le statistiche. Abbiamo costruito un pannello di visualizzazione simile a Mint di (haveamint.com), mostra i colpi oltre ogni ora, negli ultimi giorni, mesi, settimane, anni ... ecc. La versione pugno corse query rette tirando i dati dalla tabella colpi e interpretariato al volo. Che non ha funzionato per molto tempo. La nostra soluzione attuale è che i colpi sono "in coda" per l'elaborazione e abbiamo un cron venire attraverso ogni 5 minuti che prendono i colpi e lo smistamento in "cache" per ogni ora, giorno, settimana, mese, anno, ecc .... Questo funziona incredibile ed è incredibilmente scalabile; Tuttavia, funziona solo per 1 fuso orario. Dal momento che l'intera azienda ha accesso a questo, abbiamo a che fare con poche centinaia di utenti in diversi fusi orari. Quello che io definisco "Oggi" a San Jose è molto diverso da quello che la mia collega a Londra definisce oggi. Dal momento che la soluzione attuale è memorizzato nella cache solo per 1 fuso orario, è un incubo per chiunque abbia il controllo dei dati al di fuori del nostro fuso orario.

Il nostro piano attuale per risolvere questo problema è quello di creare le cache per ogni fuso orario (40 in totale); tuttavia, ciò significherebbe che stiamo moltiplicando la quantità di dati da 40 ... è terribile per me e dato che le cache possono essere molto grandi, moltiplicandolo suona proprio come una cattiva idea; In più, quando andiamo a elaborare la coda, sta andando a prendere molto più tempo di CPU di metterli in 40 diverse cache.

Qualsiasi altro avere una migliore idea di come risolvere questo problema?

(Ci scusiamo per un lungo question..it quali non è esattamente facile da spiegare. Grazie a tutti!)

È stato utile?

Soluzione

La soluzione che proponete ha troppa ridondanza. Vorrei suggerire di memorizzare i dati in almeno secchi di 30 minuti invece che ogni ora e il fuso orario essere normalizzato a UTC.

Con secchi di 30 minuti, se un utente richiede dati orari per 1 - 14:00 da -4.5 UTC è possibile recuperare i dati per 5:30-18:30 dal vostro sistema e dimostrare che. Se si memorizzano i dati in incrementi di un'ora non è possibile soddisfare le richieste per gli utenti di fuso orario con N + 0,5 differenze ora.

Per i numeri di tutti i giorni si avrebbe bisogno di aggregare 48 slot di mezz'ora. Gli slot per scegliere sarebbero determinate dal fuso orario dell'utente.

Si fa interessante quando si arriva a dati annuali perché si finisce per dover aggregare 17.520 secchi di mezz'ora. Per facilitare il calcolo che vorrei suggerire che si ottiene i dati annuali pre-aggregate per ora UTC ei dati sottrarre aggregati relativi al primo per 4,5 ore l'anno e aggiungere dati aggregati per le prime 4,5 ore del prossimo anno. Ciò essenzialmente spostare l'intero anno di 4,5 ore e il lavoro non è più di tanto. Lavorando da qui, è possibile ottimizzare ulteriormente il sistema.

EDIT:. Si scopre che Kathmandu è 5,45 GMT così si avrebbe bisogno di memorizzare i dati in secchi di 15 minuti invece di benne di 30 minuti

EDIT 2: Un altro miglioramento è facile intorno aggregando annuale, in modo non c'è bisogno di aggiungere 17.520 secchi ogni volta e senza la necessità di un aggregato per paese. Aggregare i dati annuali dal 2 gennaio - dicembre 30. Dal momento che la differenza massima di fuso orario tra due paesi è di 23 ore, questo significa che si può prendere i dati annuali (gennaio 02-30 dicembre) e aggiungere un paio di secchi prima e dopo come appropriato. Ad esempio per un fuso orario GMT -5 si dovrebbe aggiungere tutti i secchi su 1 gennaio 0500, dopo, tutti i secchi il 31 dicembre, e il 1 gennaio l'anno successivo fino a 0500 ore.

Altri suggerimenti

Quando si progetta un software che tocca più fusi orari, direi che per memorizzare sempre la data / orari in UTC con un altro campo per il fuso orario originale e hanno una funzione che prende il tempo e lo converte da e UTC / fuso orario. Potrai risparmiare un sacco di problemi per gestire i diversi casi di interruttore di giorno, l'ora legale, le persone in cerca di statistiche da un paese dall'altra parte della terra e così via ....

Nel tuo caso, avendo la cache in UTC e solo regolando le richieste da convertire in UTC dovrebbe aiutare. Non conservare una statistica come "oggi", conservarlo per le ore 00: 00: 00UTC a 23: 59:. 59UTC e quando qualcuno chiede per le statistiche per oggi a New York, fare la conversione

Per quanto posso vedere, si sta cercando per la parte di archiviazione di un sistema di data warehouse qui (i report sarebbe la front-end).

In realtà, il modo in cui i sistemi commerciali stanno facendo, è la cache hai descritto: Preaggregate le tabelle e creare le cache di loro. L'unico modo per accelerare le vostre domande è quello di rendere il sistema di database fare di meno per loro. Ciò significa meno dati, che a sua volta significa meno tempo trascorso in iterazione dati o meno dati negli indici.

Detto questo, vorrei sia propongo la "soluzione 40 cache" (ci sono davvero più di 24 fusi orari). Si dovrebbe essere in grado di parallelizzare banalmente coda l'ordinamento per la creazione di copie dei dati.

Un altro modo per fare questo, potrebbe essere quella di memorizzare nella cache all'ora di granularità e poi aggregare le ore in giorni (o 30 minuti se i tuoi fusi orari richiedono questo). Questo significa che in cache ad una granularità più fine di quanto la cache ogni giorno, ma ad una granularità grossolana rispetto ai dati originali.

questo tipo di dati è di solito memorizzato utilizzando round-robin o database circolari. controllare questo http://www.shinguz.ch/MySQL/mysql_20070223.html questo http: //techblog.tilllate. com / 2008/06/22 / round-robin-data-storage-in-mysql / per sapere come funzionano e come implementare sotto MySQL

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