Pregunta

Tema:

Estoy tratando de implementar un trabajo básico de programación en Java para manejar recurrente persistió tarea programada (por un personal aprender de proyecto).No quiero usar cualquiera (listo para usar) las bibliotecas como Cuarzo/Obsidiana/Cron4J/etc.

Objetivo:

  • El trabajo tiene que ser persistente (para controlar el apagado del servidor)
  • La ejecución de trabajos de tiempo, puede tomar hasta ~2-5 mn.
  • Gestionar una gran cantidad de trabajo
  • Multithread
  • Ligero y rápido ;)

Todo mi trabajo está en una Base de datos MySQL.

JOB_TABLE (id, name, nextExecution,lastExecution, status(IDLE,PENDING,RUNNING))

Paso por paso:

  1. Recuperar cada puesto de trabajo "JOB_TABLE"donde “nextExecution > now” AND “status = IDLE“.Este paso se ejecuta cada 10 minutos por un solo hilo.

  2. Para cada puesto de trabajo obtenido, puse un nuevo hilo en un ThreadPoolExecutor entonces puedo actualizar el estado de trabajo "PENDING"en mi "JOB_TABLE”.

  3. Cuando el trabajo subproceso se está ejecutando, puedo actualizar el estado de trabajo "RUNNING”.

  4. Cuando el trabajo está terminado, puedo actualizar el lastExecution con el tiempo actual, he de poner una nueva nextExecution tiempo y puedo cambiar el estado de trabajo "IDLE”.

Cuando el servidor está empezando, puse cada PENDIENTE/trabajo en EJECUCIÓN en el ThreadPoolExecutor.

Pregunta/Observación:

  • Paso 2 :Se la ThreadPoolExecutor manejar una gran cantidad de hilo (~20000) ?
  • Debo usar una solución NoSQL en lugar de MySQL ?
  • Es la mejor solución para lidiar con tal de caso de uso ?

Este es un proyecto, no hay ningún código detrás.Estoy abierto a sugerencias, comentarios y críticas!

¿Fue útil?

Solución

He hecho similar a la de su tarea en un proyecto real, pero en .NET.Aquí es lo que puedo recordar con respecto a tus preguntas:

Paso 2 :Se la ThreadPoolExecutor manejar una gran cantidad de hilo (~20000)?

Hemos descubierto que .NET integrado en el grupo de subprocesos fue el peor enfoque, ya que el proyecto fue una aplicación web.Razón:la aplicación web se basa en la incorporada en el hilo de la piscina (la cual es estática y por lo tanto compartida para todos los usos dentro del proceso de ejecución) para ejecutar cada solicitud en un hilo separado, mientras que mantener la efectividad de reciclaje de los hilos.Empleando el mismo hilo de la piscina para nuestro proceso interno se va a agotar y no dejar libre hilos para que el usuario solicita, o echar a perder su rendimiento, lo que era inaceptable.

Como usted parece estar funcionando bastante un montón de puestos de trabajo (20k es mucho para una sola máquina), entonces usted definitivamente debe buscar una costumbre grupo de subprocesos.No hay necesidad de escribir su propia aunque, apuesto a que hay son soluciones listas y escribir uno está mucho más allá de lo que su proyecto de estudio requeriría* ver los comentarios (si entiendo correctamente, usted está haciendo una escuela o un proyecto de la universidad).

Debo usar una solución NoSQL en lugar de MySQL?

Depende.Obviamente, se necesita actualizar el estado de los trabajos de manera simultánea, por lo tanto, usted tendrá acceso simultáneo a una única tabla de múltiples hilos.Las bases de datos pueden escala bastante bien para que, suponiendo que usted hizo lo correcto.Aquí es lo que yo me refiero a hacer de este derecho:

  • El diseño de su código de manera que cada puesto de trabajo afectará tan sólo a su propio subconjunto de filas en la base de datos (esto incluye a otras tablas).Si usted es capaz de hacerlo, usted no tendrá necesidad de bloqueos explícitos en la base de datos de nivel (en la forma de transacción de la serialización de los niveles).Usted puede incluso hacer cumplir un liberal de serialización nivel que puede permitir sucio o lecturas fantasma - que se realice más rápido.Pero ten cuidado, usted debe asegurarse de que ningún puestos de trabajo de acuerdo sobre las mismas filas.Esto es difícil de lograr en proyectos de la vida real, por lo que probablemente debería buscar enfoques alternativos en db de bloqueo.

  • El uso apropiado de transacción de serialización modo. La transacción de serialización de modo define el comportamiento de los bloqueos a nivel de base de datos.Usted puede configurarlo para bloquear toda la tabla, sólo las filas que afectan, o nada en absoluto.Utilizar sabiamente, como cualquier mal uso puede afectar a la consistencia de los datos, la integridad y la estabilidad de toda la aplicación o la base de datos del servidor.

  • Yo no estoy familiarizado con la base de datos NoSQL, así que sólo puedo aconsejarte a la investigación sobre la concurrencia de las capacidades y asignarlos a su escenario.Usted podría terminar para arriba con una solución adecuada, pero usted tiene que comprobar de acuerdo a sus necesidades.Desde su descripción, usted tendrá que apoyar simultánea de datos de las operaciones a través del mismo tipo de objetos (lo que es el análogo de una tabla).

Es la mejor solución para lidiar con tal de caso de uso ?

Sí y No.

  • , como usted se encontrará con una de las tareas más difíciles que los desarrolladores se enfrentan en el mundo real.He trabajado con colegas que tienen más de 3 veces en mi propia experiencia y que eran más reacios a hacer multi-threading tareas que a mí, que realmente odiaba.Si usted siente que esta zona es interesante para usted, jugar con él, aprender y mejorar como todo lo que tiene que.

  • No, porque si usted está trabajando en un real proyecto de vida, usted necesita algo fiable.Si usted tiene muchas preguntas, obviamente se necesita tiempo para madurar y ser capaz de producir una solución estable para tal tarea.Multi-threading es un tema difícil por muchas razones:

    • Es difícil de depuración
    • Presenta muchos puntos de falla, usted necesita estar consciente de todos ellos
    • Podría ser un dolor de cabeza para otros desarrolladores para ayudar o trabajar con el código, a menos que usted se pega a las normas generalmente aceptadas.
    • Manejo de errores puede ser difícil
    • El comportamiento es impredecible / undeterministic.

    Existen soluciones con un alto nivel de madurez y fiabilidad que son el enfoque preferido para proyectos reales.Desventaja es que usted tendrá que aprender de ellos y examinar cómo personalizables son para sus necesidades.

De todos modos, si usted necesita para hacerlo a tu manera, y entonces el puerto de su logro a un proyecto real, o un proyecto de su propia, que me pueda asesorar para hacer esto en un conectables manera.El uso de la abstracción, programación de interfaces y otras prácticas de disociar su propio específicos de la aplicación de la lógica en la que se establece los trabajos programados.De esa manera, usted puede adaptar su api a una solución existente si esto se convierte en un problema.


Y por último, pero no menos, No vi ningún error-el manejo de las predicciones de su lado.De pensar y de investigación sobre qué hacer en caso de un error del trabajo.Al menos añadir un 'ERROR' de estado o algo persistir en tal caso.El manejo de errores es difícil cuando se trata de los hilos, así que sea cuidadoso en su investigación y prácticas.

Buena suerte

Otros consejos

Usted puede declarar el tamaño máximo del grupo con ThreadPoolExecutor#setMaximumPoolSize(int).Como Integer.MAX es más grande de 20000 a continuación, técnicamente sí se puede.

La otra pregunta es que ¿su máquina wold apoyo de tantos hilo de ejecución.Usted tendrá proporcionar suficiente memoria RAM para cada banda de rodadura asignará en la pila.

De ti no debe ser problema para dirección ~20,000 hilos en el moderno equipo de escritorio o portátil, pero en el dispositivo móvil podría ser un problema.

Doc:

El Core y el máximo de la piscina tamaños

Un ThreadPoolExecutor automáticamente ajustar el tamaño de la piscina (ver getPoolSize()) de acuerdo a los límites fijados por corePoolSize (ver getCorePoolSize()) y maximumPoolSize (ver getMaximumPoolSize()).Cuando una nueva tarea se presenta en el método de ejecución(java.lang.Runnable), y menos de corePoolSize hilos son ejecuta, se crea un nuevo hilo para la gestión de la solicitud, incluso si otros subprocesos de inactividad.Si hay más de corePoolSize pero menos de maximumPoolSize hilos de ejecución, un nuevo hilo será creado sólo si la cola está llena.Mediante el establecimiento de corePoolSize y maximumPoolSize el mismo, se crea un tamaño fijo de grupo de subprocesos.Mediante el establecimiento de maximumPoolSize a una esencialmente ilimitada de valor, tales como Entero.MAX_VALUE, que permiten la piscina para dar cabida a un arbitrario número de tareas simultáneas.Normalmente, el núcleo y el máximo de la piscina los tamaños se establecen sólo en la construcción, pero también puede ser cambiado dinámicamente utilizando setCorePoolSize(int) y setMaximumPoolSize(int).

Más

Sobre la base de datos.Crear una solución que no dependen en DB de la estructura.A continuación, puede configurar dos enviorements y medir.Comienza con la tecnología que usted sabe.Pero manténganse abiertos a otras soluciones.Al comenzar las relaciones DB debe mantener con el rendimiento.Y si la sarna es propiamente el que no debe ser una cuestión más adelante.La NoSQL se utilizan para trabajar con big data.Pero la mejor es la de crear y ejecutar algunas pruebas de rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top