2010-12-30 11 views
8

Sto lavorando ad un'applicazione web, che storicamente è stata costruita su uno stack PHP/MySQL.L'utilizzo di server Web di stato ha senso?

Una delle operazioni chiave dell'applicazione doveva eseguire alcuni calcoli pesanti che richiedevano l'iterazione su ogni riga di un'intera tabella DB. Inutile dire che questo è stato un serio collo di bottiglia. Quindi è stata presa una decisione per riscrivere l'intero processo in Java.

Questo ci ha dato due vantaggi. Uno era che Java, come linguaggio, era molto più veloce di un processo PHP. Il secondo era che potevamo mantenere l'intero set di dati nella memoria del server delle applicazioni Java. Così ora possiamo fare le operazioni pesanti di calcolo in memoria, e tutto accade molto più velocemente.

Questo ha funzionato per un po ', fino a quando non ci siamo resi conto che abbiamo bisogno di ridimensionare, quindi ora abbiamo bisogno di più server web.

Il problema è che, con la progettazione attuale, tutti devono mantenere lo stesso identico stato. Tutti interrogano il DB, elaborano i dati e li mantengono in memoria. Ma cosa succede quando è necessario modificare questi dati? In che modo tutti i server mantengono la coerenza?

Questa architettura mi sembra imperfetta. Il beneficio delle prestazioni dal tenere tutti i dati in memoria è ovvio, ma questo ostacola seriamente la scalabilità.

Quali sono le opzioni da qui? Passare a una memoria, valore-chiave, archivio dati? Dovremmo rinunciare completamente allo stato di attesa all'interno dei server web?

risposta

4

ora passare alla Erlang :-)

sì, è uno scherzo; ma c'è un granello di verità. il problema è: originariamente il tuo stato era in un repository esterno, condiviso: il DB.ora lo hai (parzialmente) precalcolato in un repository interno non condiviso: oggetti RAM Java. Il modo ovvio è di averlo ancora precalcolato, ma in un repository condiviso esterno, più veloce è, meglio è.

Una semplice risposta è memcached.

Un altro è creare il proprio "server di calcolo", che centralizza sia l'attività di calcolo che i risultati (parziali). Il frontend web elabora solo l'accesso a questo server. In Erlang sarebbe il modo naturale per farlo. In altre lingue, il davanzale può farlo, solo più lavoro. Controlla ZeroMQ per l'ispirazione, anche se non lo usi alla fine (ma è un'impresa maledettamente buona).

+0

+1 per il grano della verità. – duffymo

1

Questo può essere cliché, ma i dati si espandono sempre per riempire lo spazio in cui l'hai inserito. I tuoi dati potrebbero essere tutti in memoria oggi, ma ti garantisco che non lo faranno in futuro. Quanto è lontano il tempo necessario per capire un'architettura migliore. Lo stato della tua applicazione è solo un sintomo di questo problema più grande.

Ognuno fa calcoli diversi sull'intero set di dati? È qualcosa che puoi fare in un lotto durante la notte e avere accesso alle persone durante il giorno? Quanto è sensibile al tempo?

Penso che queste siano le domande a cui è necessario rispondere in quanto ad un certo punto non sarà possibile acquistare abbastanza memoria per memorizzare i dati necessari. Potrebbe sembrare sciocco dato a dove sei ora, ma dovresti pianificare su quello essere vero. Molti sviluppatori con cui ho parlato non pensano a che aspetto ha il successo e che impatto ha sui loro progetti.

+0

Sono assolutamente d'accordo con te. Raggiungeremo * un punto in cui tenere tutti questi dati in memoria sarà un problema. Quali soluzioni esistono per questa situazione? Un archivio dati K-V è un'opzione? Memorizza una volta per tutti i server web? O inoltre, se i dati grezzi sono archiviati in un DB pesante sul back-end, dove memorizzi i meta-dati che dovrebbero essere facilmente accessibili? –

+0

Non conosco abbastanza la natura dei tuoi dati o calcoli per aiutarti. – n8wrl

1

Sono d'accordo con te - questo sembra imperfetto, ma avrei bisogno di più dettagli per saperlo con certezza.

Si menziona un set di dati di grandi dimensioni e calcoli pesanti, ma non si parla di come vengono aggiornati i dati, quando vengono eseguiti i calcoli, se si tratta di dati di un giorno o dell'intero set di dati, ecc. Suona molto simile a un lavoro batch che potrebbe essere fatto giornalmente off-line.

Se questo è il caso, non sono sicuro di dove si collega il web. I tuoi utenti web eseguono query personalizzate solo dopo aver completato il crunch? I dati sono di sola lettura o letti principalmente per gli utenti? O stanno cambiando i dati continuamente al volo?

Mi chiedo se la tecnologia di persistenza che hai scelto influenzi le cose? Forse un'alternativa NoSQL potrebbe essere migliore per il tuo problema, come un cluster MongoDB distribuito.

+0

In generale, dove è opportuno archiviare i meta-dati che consentono di eseguire i calcoli più pesanti più velocemente? –

1

Questa è una domanda di motore di dati, credo, tanto quanto è una domanda di distribuzione di server web. Perché il tuo motore di database (centrale) non può eseguire il calcolo (abbastanza rapidamente)?

È possibile memorizzare valori precalcolati che vengono contrassegnati come non aggiornati quando i dati sottostanti vengono modificati, richiedendo un ricalcolo. Non è necessario aggirare la necessità di ricalcolare quando i dati cambiano. Hai solo bisogno di gestire quando e come avviene il cambiamento in quanto influenzerà i consumatori dei dati.

+0

Il database contiene solo i dati non elaborati. Non è costruito per contenere i meta-dati derivati ​​dai dati grezzi. –

+1

Non penso sia corretto chiamare calcoli basati su dati "metadati". Questo termine potrebbe essere fuorviante. I metadati sono dati su dati, non dati derivati ​​da dati. In ogni caso, il motore di dati è IMO il posto giusto e più semplice per risolvere la domanda. Il motore di dati ha capacità computazionale e la struttura del database è estensibile. L'alternativa è uno schema complesso in cui i consumatori dei dati dei clienti si abbonano a un servizio di pubblicazione delle modifiche, in modo che possano aggiornare le copie distribuite locali del set di dati principale. – Tim

Problemi correlati