10

Antes que nada, tengo una pregunta conceptual: ¿la palabra "distribuida" solo significa que la aplicación se ejecuta en varias máquinas? o hay otras formas en que una aplicación se puede considerar distribuida (por ejemplo, si hay muchos módulos independientes interactuando juntos pero en la misma máquina, ¿está distribuido?).¿Cómo construir una aplicación java distribuida?

En segundo lugar, quiero construir un sistema que ejecute cuatro tipos de tareas, habrá múltiples clientes y cada uno tendrá muchas tareas de cada tipo que se ejecutarán periódicamente. Por ejemplo: customer1 tendrá task_type1 hoy, task_type2 después de dos días y así sucesivamente, puede haber customer2 que tenga task_type1 para ser ejecutado al mismo tiempo como customer1's task_type1. es decir, hay una necesidad de concurrencia. La configuración para ejecutar las tareas se almacenará en DB y los resultados de estas tareas también se almacenarán en DB. los clientes utilizarán el sistema desde un navegador web (páginas html) para interactuar con el sistema (básicamente, configurar tareas y ver los resultados). Pensé en usar un servicio web de descanso (usando JAX-RS) donde las páginas html se comunicarían con y en el back-end usar hilos para ejecución concurrente. Preguntas:

  1. Esto suena simple, pero yo que va en la dirección correcta? o debería usar otras tecnologías o conceptos como Java Beans, por ejemplo?

2. Si mi enfoque es correcto, ¿necesito usar un lenguaje de script como JSP o puedo enviar formularios html directamente a las URL restantes y obtener el resultado (usando JSON, por ejemplo)?

  1. Si quiero distribuir la aplicación, ¿es posible con mi idea? Si no, ¿qué necesitaría usar?

Lo siento por tener muchas preguntas, pero estoy realmente confundido acerca de esto.

+0

¿realmente espera que 'task_type1',' task_type2', etc. va a requerir mucha CPU? ¿Has * probado * para confirmar eso? ¿Realmente van a haber muchos usuarios que utilicen la aplicación al mismo tiempo? Puede ser que un solo servidor pueda manejar la carga correctamente y que la distribución de la aplicación complicaría las cosas sin ningún beneficio adicional. Segundo, no asuma que necesita hilos porque "las tareas deben ser ejecutadas al mismo tiempo". A menos que necesite aprovechar múltiples CPU, un solo hilo que retire tareas de una cola de trabajo probablemente funcionará bien. –

+0

@AlexD las tareas en sí no son intensivas en la CPU, pero si recibo muchos clientes con muchas tareas, esto podría ser un problema en el futuro, estoy considerando la escalabilidad para el futuro. Supongo que un servidor manejaría por ahora. Pero quería saber cómo distribuirlo en caso de que lo necesite. es decirQuería entender los conceptos de distribución. – Sami

+0

@AlexD En cuanto a los hilos, necesito que las tareas se ejecuten en momentos específicos; por ejemplo, puede haber task_type1 para ser ejecutado a las 10:00 a.m. para customer1 y otro task_type1 para customer2 también a las 10:00 a.m. Necesito algún tipo de concurrencia en la ejecución. es decir: procesar las dos tareas en paralelo. – Sami

Respuesta

5

El término "aplicación distribuida" significa que las partes del sistema de aplicación se ejecutarán en diferentes nodos computacionales (que pueden ser diferentes CPU/núcleos en diferentes máquinas o entre múltiples CPU/núcleos en la misma máquina).

Existen muchas soluciones tecnológicas diferentes a la pregunta de cómo se puede construir el sistema. Como usted preguntaba por las tecnologías Java, podría, por ejemplo, crear la aplicación web utilizando el Web Toolkit de Google, que le proporcionará una experiencia de usuario enriquecida basada en el navegador. Para el servidor implementado partes de su sistema, puede comenzar utilizando servlets simples que se ejecutan en un contenedor de servlets como Tomcat. Sus servlets serán llamados desde el navegador usando llamadas de procedimiento remoto basadas en HTTP.

Más tarde, si se encuentra con problemas de escalabilidad, puede comenzar a migrar partes de la lógica empresarial a componentes EJB3 que pueden implementarse en muchos nodos computacionales dentro del contexto de un servidor de aplicaciones, como Glassfish, por ejemplo. No creo que deba abordar este problema hasta que lo ejecute. Es difícil decir si lo hará sin saber más sobre la naturaleza de las tareas que el cliente realizará.

4

Para responder a su primera pregunta, usted podría obtener el formulario para enviar directamente a las URL de descanso. Obviamente, depende exactamente de sus requisitos.

Como @AlexD mencionó en los comentarios anteriores, no siempre es necesario distribuir una aplicación; sin embargo, si así lo desea, probablemente debería considerar mirar JMS, que es una API de mensajería, que puede permitirle para ejecutar casi cualquier número de máquinas de aplicaciones de trabajo, preparando mensajes de la cola de mensajes y procesándolos.

Si desea producir una aplicación distribuida dinámicamente, ejecutar en, por ejemplo, múltiples máquinas virtuales de bajo recursos (como instancias de Amazon EC2 Micro) o hardware físico, que se pueden agregar y eliminar a voluntad para hacer frente a la demanda, Es posible que desee considerar la integración con Project Shoal, que es un marco de trabajo de Java que permite la agrupación de nodos de aplicaciones y hacer que aparezcan/desaparezcan en cualquier momento. Project Shoal usa JXTA y JGroups como el protocolo de comunicación subyacente.

Otra ruta podría ser distribuir su aplicación usando EJB s ejecutándose en un servidor de aplicaciones.

6

Solo quiero agregar un punto a las respuestas ya publicadas. Por favor, tome mis comentarios con un grano de sal, ya que todas las aplicaciones web que he creado se han ejecutado en un solo servidor (aparte de las aplicaciones implementadas en Heroku, que pueden "distribuir" su aplicación por usted).

Si usted siente que puede que tenga que distribuir su aplicación para la escalabilidad, lo primero que debe pensar es no servicios web y multihilo y colas de mensajes y Enterprise JavaBeans y ...

Lo primero para pensar es su dominio de aplicación en sí y lo que la aplicación va a hacer. ¿Dónde estarán las piezas intensivas en CPU? ¿Qué dependencias hay entre esas partes? ¿Las partes del sistema se dividen naturalmente en procesos paralelos? Si no, ¿puedes rediseñar el sistema para que así sea? IMPORTANTE: ¿qué datos deben compartirse entre hilos/procesos (si se están ejecutando en la misma máquina o en máquinas diferentes)?

La situación ideal es donde cada subproceso/proceso/servidor paralelo puede obtener su propio trozo de datos y trabajar en él sin necesidad de compartir. Aún mejor es si ciertas partes del sistema pueden convertirse en apátridas: el código sin estado es infinitamente paralelizable (fácil y naturalmente). Cuanto más frecuente y preciso sea el intercambio de datos entre procesos paralelos, menos escalable será la aplicación. En casos extremos, es posible que ni siquiera aumente el rendimiento al distribuir la aplicación. (Esto se puede ver con el código de multiproceso - si sus hilos sostienen constantemente por la misma cerradura (s), su programa puede ser incluso más lento con múltiples hilos + CPU que con un hilo + CPU.)

El conceptual Desglose del trabajo por hacer es más importante que las herramientas o técnicas que realmente utiliza para distribuir la aplicación. Si su desglose conceptual es bueno, será mucho más fácil distribuir la aplicación más adelante si comienza con un solo servidor.

Cuestiones relacionadas