2011-02-02 13 views
8

De manera simplificada, mi aplicación Java se puede describir de la siguiente manera:¿Cómo hacer que mi aplicación Java sea escalable y tolerante a errores?

Es una aplicación web que se ejecuta en un servidor Tomcat con una interfaz SOAP. La aplicación utiliza JPA/Hibernate para almacenar datos en una base de datos MySQL. Los datos almacenados consisten en una lista de usuarios, una lista de hosts y una lista de URI que apuntan a archivos enormes (10 GB) en el sistema de archivos. Todo el sistema consta de un servidor central, donde se ejecuta mi aplicación, y un montón de hosts de trabajadores. Un usuario puede conectarse a la interfaz SOAP y pedirle al sistema que copie los archivos que le pertenecen a un host trabajador específico, donde luego puede analizar los datos de alguna manera (no podemos usar NFS, tenemos que copiar los datos a la almacenamiento en disco local de un host de trabajador). La base de datos luego almacena para cada usuario en qué host de trabajo se almacenan sus archivos.

Actualmente, el sistema se ejecuta con un servidor central con la aplicación Tomcat y la base de datos MySQL y 10 hosts de trabajadores y unos 30 usuarios que tienen 100 archivos almacenados en los hosts de los trabajadores (en promedio 10 GB).

Pero en el futuro tengo que escalar el sistema por un factor de 100-1000. Así que podría tener que lidiar con 10000 usuarios, 100000 archivos y 10000 hosts. Y el sistema también debe volverse tolerante a fallas, por lo que no tengo un único servidor central (que es el único punto de falla en el sistema ahora), pero tal vez varios. Además, si uno de los hosts del trabajador falla, el sistema debe recibir una notificación, por lo que no intenta copiar archivos en ese servidor.

Mi pregunta es ahora: ¿Qué tecnologías Java podría usar para que mi aplicación sea escalable y tolerante a fallas? ¿Qué tipo de arquitectura recomendarías? ¿Debería tener una enorme base de datos almacenando toda la información sobre todos los archivos, hosts y usuarios en el sistema en un solo lugar, o debería distribuir mejor mi base de datos en varios hosts y sincronizarlos de alguna manera?

Respuesta

11

La tecnología que necesita se llama Arquitectura.

Independientemente de la tecnología que utilice, debe contar con un sistema bien estructurado para la escalabilidad y la redundancia. Haga un diagrama de toda la arquitectura del sistema tal como funciona actualmente. Marque cada componente con sus limitaciones para usuarios, trabajos, ancho de banda, espacio en el disco duro, memoria o cualquier parte que limite su aplicación. Esto le dará el diseño de referencia.

Ahora dibuje el mismo diagrama que necesitaría para cumplir con sus requisitos de escalabilidad y redundancia. Puede que tenga que separar las piezas para que funcione, o desarrollar piezas completamente nuevas. Este diagrama dejará muy claro lo que necesita.

Una cosa específica que quiero abordar es la base de datos. Si puede dividir la base de datos entre líneas logísticas para que no se una a ninguna consulta de una a otra, entonces debe tener bases de datos separadas. Más allá de eso, la mejor configuración para una base de datos es tener cada base de datos en una máquina rápida con mucho almacenamiento y tiempos de acceso muy rápidos. Si hace esto, lo único que ralentizará su base de datos son malas consultas o tablas mal indexadas. En mi experiencia, se debe evitar sincronizar las bases de datos a menos que tenga una base de datos maestra que tenga acceso de escritura y se replique en otras bases de datos que son de solo lectura. De todos modos, este puede ser el último paso después de haber perfilado todas sus consultas y, literalmente, necesita hardware adicional.

Cuestiones relacionadas