2011-04-01 11 views
5

Transfiero el código de cliente de Java a una arquitectura de servidor con un cliente lean.Múltiples JVM frente a tareas simultáneas

El servidor necesita ejecutar una instancia del código para cada cliente. El código es multiproceso y se ejecuta durante largos períodos de tiempo (semanas), pero solo tiene una interacción ocasional con el cliente. La cantidad de clientes será de miles. Cada cliente necesita ~ 20MB de Heap.

que tengo ahora dos opciones,

  1. iniciar una JVM independiente en el servidor para cada cliente
  2. modificar mi código para que todas las solicitudes y los cálculos se realizan en el espacio compartido para cada cliente (como en una web-application)

Puedo ver los pros y los contras de cada uno. Por varias JVM:

Pros:

  • procesos son independientes, si se cuelga simplemente matarlo y reinicie. A todos los demás no les importará.
  • recursos pueden ser limitados, de modo que un cliente no puede comer encima de todas las CPU/memoria
  • fácilmente distribuidos en varias máquinas

Contras:

  • la biblioteca completa de clases JRE se carga varias veces
  • no es la forma de hacer las cosas de Java EE
  • ¿Todos los clientes necesitarán hablar por un puerto diferente?

¿Hay alguna recomendación que recomiende?

¿Conoces algún buen libro de referencia/artículo sobre el tema?

¿Hay un marco que utiliza solo una JVM pero ejecuta varias copias de código como si fuera un espacio de proceso separado (con recursos limitados, etc.)?

Respuesta

1

Puede crear un servicio web/servicio de proxy que inicie una JVM para cada cliente y los apague. Esto le daría la capacidad de eliminar solicitudes/JVM de clientes de larga ejecución.

El servidor proxy puede darles a los clientes un puerto con el que necesitan hablar a medida que el servidor reenvía las solicitudes a la JVM en ejecución para ese cliente.

BTW: Si tiene muchos clientes que ejecutan trabajos intensivos de CPU, solo tiene tantos núcleos para todos. Puede encontrar que las JVM necesitan ejecutarse en varias máquinas para admitir a todos los clientes.

3

Desafortunadamente no es posible limitar los recursos en base a subprocesos en una sola JVM. Sin embargo, me nontheless tratar de puerto de la aplicación en una única JVM, debido a las siguientes razones:

  • Si un hilo se utiliza mucha CPU, todavía se puede acabar con él (interrupción() es su amigo), si codifica las tareas correctamente
  • Si más de un cliente trabaja simultáneamente con otro cliente, supongo que tienen que compartir la CPU de todos modos.
  • ¿Se ejecutan los hilos durante varias semanas? Deberías dividir las tareas en subtareas de todos modos, para que puedas recuperarte de los reinicios y continuar tu trabajo donde lo dejaste.
  • Solo en una aplicación, los clientes pueden compartir un puerto de servidor de comunicaciones.
  • El consumo de memoria debe de alguna manera limitarse programáticamente. Para las bases de datos, esto significa que las consultas deben limitarse a un número fijo de resultados, o algo similar.
  • Si cada proceso necesita solo 20 MB de almacenamiento dinámico, necesita muchos menos recursos con una sola aplicación. La sobrecarga por JVM es de unos 30 MB, creo, y la programación de 1000 hilos podría ser más eficaz que la programación de 1000 procesos por parte del sistema operativo.
  • Usted tendrá una consola de monitoreo única para sus procesos de forma gratuita, si codifica sus aplicaciones para proporcionar información sobre JMX. Mucho más difícil de controlar si comienza un solo proceso para cada tarea.

Vaya con el enfoque de una sola aplicación, a menos que realmente no tenga ningún control sobre qué tareas pueden iniciar sus usuarios.

Cuestiones relacionadas