2011-02-02 14 views
8

In modo semplificato la mia applicazione Java può essere descritta come segue:Come rendere la mia applicazione Java scalabile e tollerante ai guasti?

Si tratta di un'applicazione Web in esecuzione su un server Tomcat con un'interfaccia SOAP. L'applicazione utilizza JPA/Hibernate per archiviare i dati in un database MySQL. I dati memorizzati sono costituiti da un elenco di utenti, un elenco di host e un elenco di URI che puntano a file enormi (10 GB) nel filesystem. L'intero sistema è costituito da un server centrale, su cui è in esecuzione la mia applicazione e un gruppo di host worker. Un utente può connettersi all'interfaccia SOAP e chiedere al sistema di copiare i file che appartengono a lui in uno specifico host di lavoro, dove può quindi analizzare i dati in qualche modo (non possiamo usare NFS, abbiamo bisogno di copiare i dati nel archiviazione locale del disco di un host worker). Il database quindi memorizza per ciascun utente su cui il lavoratore ospita i suoi file sono memorizzati.

Al momento il sistema è in esecuzione con un server centrale con l'applicazione Tomcat e il database MySQL e 10 host worker e circa 30 utenti con 100 file (in media 10 GB) di dimensioni memorizzati distribuiti sugli host worker.

Ma in futuro devo ridimensionare il sistema di un fattore di 100-1000. Quindi dovrei avere a che fare con 10000 utenti, 100000 file e 10000 host. E il sistema dovrebbe anche diventare a prova di errore, quindi non ho un singolo server centrale (che è il singolo punto di errore nel sistema ora), ma forse diversi. Inoltre, se uno degli host worker non funziona, il sistema dovrebbe essere avvisato, quindi non tenta di copiare i file su quel server.

La mia domanda è ora: quali tecnologie Java posso utilizzare per rendere la mia applicazione scalabile e tollerante ai guasti? Che tipo di architettura consiglieresti? Dovrei avere ancora un enorme database che memorizza tutte le informazioni su tutti i file, gli host e gli utenti nel sistema in un unico posto, o dovrei distribuire meglio il mio database su diversi host e sincronizzarli in qualche modo?

risposta

11

La tecnologia di cui hai bisogno si chiama Architecture.

Indipendentemente dalla tecnologia utilizzata, è necessario disporre di un sistema ben progettato per la scalabilità e la ridondanza. Crea un diagramma dell'intera architettura del sistema mentre funziona attualmente. Segna ogni componente con le sue limitazioni per gli utenti, i lavori, la larghezza di banda, lo spazio sul disco rigido, la memoria o qualsiasi altra parte che limita la tua applicazione. Questo ti darà il design di base.

Ora disegnare lo stesso diagramma che avrebbe dovuto soddisfare i requisiti di scalabilità e ridondanza. Potrebbe essere necessario rompere pezzi per farlo funzionare, o sviluppare pezzi completamente nuovi. Questo diagramma renderà molto chiaro ciò di cui hai bisogno.

Una cosa specifica che voglio risolvere è il database. Se è possibile dividere il database tra le righe logistiche in modo da non partecipare a nessuna query da una all'altra, è necessario disporre di database separati. Oltre a ciò, la migliore configurazione per un database consiste nell'avere ogni database su una macchina veloce con un sacco di spazio di archiviazione e tempi di accesso molto rapidi. Se lo fai, l'unica cosa che rallenta il tuo database sono le query cattive o le tabelle indicizzate male. Secondo la mia esperienza, la sincronizzazione dei database deve essere evitata a meno che non si disponga di un database master con accesso in scrittura e replicabile in altri database di sola lettura. Indipendentemente da ciò, questo può essere l'ultimo passaggio dopo aver profilato tutte le query e hai letteralmente bisogno di hardware aggiuntivo.