2012-03-02 14 views
8

Soy bastante nuevo en Java y realmente disfruto aprendiendo sobre él. Hice un programa que funciona bien, pero demora un poco cuando agrego más datos para procesar. Lo hice enhebrado y realmente lo aceleró mucho, pero ahora estoy pensando en tratar de acelerarlo más (obviamente, más datos tiene que procesar cuanto más tiempo lleve). Solo digo, mi programa no comparte datos entre hilos, obtiene un elemento de una lista y hace algunos cálculos y carga el resultado a una base de datos. Idealmente, algunas computadoras de trabajo obtienen algunos elementos de la lista y luego hacen su trabajo y luego obtienen más trabajo hasta que se hace¿Distribuye hilos Java en varios servidores?

Investigué un poco y encontré colas, y no estoy seguro si es lo que necesito o si hay algo más por ahí (también estaba pensando que mantener la integridad/monitor de los trabajadores puede ser demasiado para que yo escriba como novato). Tengo 4 computadoras en casa (algunas Linux, Mac y Windows ... pero puedo instalar linux vm en todos los sistemas no Linux si estas soluciones son específicas) y quería intentar que también comenzaran a trabajar en esta tarea. Pensé en crear colas de Java que los otros clientes tomaran una pieza y procesar, pero también vi bibliotecas (rabbitmq). También miré brevemente sobre la computación grid.

¿Es este el camino a seguir o hay una manera mejor? No necesito ningún código ni nada, solo quiero saber cuáles son las soluciones para distribuir los hilos o qué factores usar al evaluarlos.

Respuesta

7

Sólo para terminar - ya mayor escala tiene, ahora quiere de escalabilidad horizontal. Desde la parte superior de mi cabeza:

  • : puede crear una aplicación Java Queue que será distribuido de forma automática a través de todo el clúster. Básicamente, ejecuta la misma aplicación con pocos hilos leyendo datos de la cola. Terracotta distribuye mágicamente esa cola para que se sienta como un objeto local.

  • - enfoque similar al de la terracota, estructuras de datos distribuidos y ejecutores

  • - enviar un mensaje con una pieza de trabajo a una cola JMS (cola, de nuevo) y tener varios oyentes. Cada oyente es más o menos un solo hilo. Los oyentes se pueden configurar en diferentes máquinas.

  • - Mapa/Reduce el marco de Java para escalar fácilmente grandes cantidades de datos. Normalmente se usa para procesar datos y agregar resultados.

9

Puede usar JMS o Hazelcast (por ejemplo, ExecutorService distribuido) para distribuir trabajo entre máquinas.

Lo que haría primero es mejorar sus algoritmos. Puede encontrar que puede ir 2-4 veces más rápido usando 4 máquinas, pero puede obtener una mejora en el rendimiento de 10 a 1000 veces a través de perfiles de rendimiento, refactorización y afinaciones, a menudo con menos complejidad.

1

No necesita una VM virtual para ejecutar Java. Probablemente su programa se ejecutará sin problemas en los tres sistemas operativos principales.

Iré con la solución más simple. Tener un proceso maestro para recuperar tareas, distribuirlas a las computadoras de los trabajadores, recopilar resultados y enviarlos a una base de datos.

Conecte las computadoras con enchufes. Todos los trabajadores pueden abarcar hilos n+1 donde n es la cantidad de núcleos de CPU en esa máquina.

2

En general, el uso de una cola (como RabbitMQ) para cargar en "puestos de trabajo", y luego tirar de los trabajadores que tienen empleos fuera de la cola para su procesamiento es el patrón más escalable que no se toma demasiado trabajo para ponerse en marcha.

Una vez que esté en su lugar, puede aumentar el número de trabajadores que necesite, repartidos entre las máquinas que tenga/necesite.

Después de que la arquitectura general de "transmisión de mensajes" esté en su lugar, el siguiente paso es siempre averiguar qué está causando que el proceso sea lento. No todos los problemas se pueden resolver simplemente lanzando más hilos en un cuadro o más cuadros en un grupo (muchos pueden, sin embargo).

Por ejemplo, si los trabajos están vinculados a la CPU, no tiene sentido ejecutar más hilos en una sola caja que los núcleos para ejecutarlos (-1 núcleo que se utiliza para gestionar los hilos).

Si las operaciones están vinculadas a un disco o una red, sin embargo, ese tipo de trabajos se pueden construir de forma asíncrona internamente al trabajo que permite que otros hilos entren mientras que el primero espera que venga el disco o la red de vuelta con lo que pidió.

En última instancia, la arquitectura de paso de mensajes es la pieza más importante, y después de eso se trata de optimizar los trabajos y utilizar sus recursos de manera eficiente, lo que requiere un conocimiento profundo del dominio.

Si supera la mayor parte de la optimización del trabajo, puede comenzar a observar las técnicas de caché entre procesos utilizando cachés rápidos de valores-clave como Redis para no recauchutar datos que necesita una y otra vez .

Cuestiones relacionadas