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?