2012-04-16 15 views
12

Estoy buscando un reemplazo "at" escalable, con alta disponibilidad. Debe admitir la adición y eliminación de trabajos en tiempo de ejecución.Buscando una implementación "at" escalable

Algunos antecedentes: Tengo una aplicación donde desencadenar millones de eventos, cada evento ocurre una sola vez. No necesito mecanismos tipo cron (primer domingo del mes, etc.), simplemente fecha, hora y contexto.

Actualmente estoy usando el Quartz scheduler, y si bien es un proyecto muy bueno, tiene dificultades para manejar la cantidad de eventos que le arrojamos, incluso después de un montón de ajustes (fragmentación, aumento del intervalo de sondeo, etc.) debido al bloqueo básico que realiza en la base de datos de subrayado. Además, es un poco exagerado para nosotros, ya que básicamente tenemos millones de desencadenantes de una sola vez y un número relativamente pequeño de trabajos.

lo agradecería cualquier sugerencia

+0

¿Cuáles son sus necesidades de todo el fracaso? Por ejemplo, si una máquina se cae, ¿le gustaría que los eventos "perdidos" se disparen cuando aparece un reemplazo? –

+0

Sí, similar a Quartz. Además, ejecuto Quartz en un clúster, por lo que siempre hay una máquina caliente en espera (en Quartz todos los nodos compiten cada vez que necesitan sondear la base de datos para buscar trabajos) –

+0

Me preguntaba qué fácil podíamos hacer las cosas * sin * Quartz. Sin embargo, si cada trabajo tiene que ser reconocido, eso lo hace más complicado. ¿Cuál es la penalidad si un trabajo se ejecuta dos veces? (Por ejemplo, ¿podría confirmar todos los trabajos ejecutados en el último minuto, una vez por minuto?) –

Respuesta

0

Tal vez sólo tiene que utilizar JGroupsshared tree con tareas Según tiempo de ejecución. Los nodos tomarán la primera tarea y programarán el temporizador, que se ejecutará en un momento determinado. En la tarea, quitar el temporizador puede cancelarse. Así que, básicamente, puede usar solo JGroups y Timers/Executors simples de Java.

No he leído entero, pero aquí es un poco de proof of concept or maybe even solution

0

¿y el temporizador de Java?

import java.util.*; 

public class MyTask extends TimerTask{ 
    public void run(){ 
     System.out.println("do it!"); 
    } 
} 

y luego

Timer timer = new Timer(); 

MyTask job1 = new MyTask(); 
// once after 2 seconds 
timer.schedule(job1, 2000); 

job1.cancel(); 

MyTask job2 = new MyTask(); 
// nach each 5 seconds after 1 second 
timer.schedule (job2, 1000, 5000); 
+0

1. No sobrevive el reinicio del proceso; 2. ¿Cómo lo escalan a millones de trabajos? Esto es lo que Quartz pretende resolver –

+0

1. No mencionaste que la persistencia es un requisito; 2. Dijiste que hay un número relativamente pequeño de trabajos. – kromit

+0

Lo siento, pero mencioné "Alta disponibilidad" y "Millones de eventos/Millones de desencadenantes de una sola vez" ... –

1

Si estaba enfrentando el mismo escenario que haría la siguiente ...

instalación de un clúster de cola JMS (por ejemplo RabbitMQ o ActiveMQ) usando una cola de replicación configurar en unas pocas cajas.

Dispare todos los eventos en mi agradable cola JMS altamente disponible.

Entonces me codificar una aplicación agente que hizo estallar los eventos de la cola JMS, según sea necesario, podría ejecutar múltiples agentes en múltiples cajas y he que combinada con la correcta JMS conmutación por error url etc.

También es posible usar el mismo tipo de modelo si sus puestos de trabajo están disparando los eventos ...

FYI, una manera más agradable de la programación en el núcleo de Java es la siguiente:

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount); 
    threadPool.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
     //Pop events from event queue. 
     //Do some stuff with them. 
    } 

    }, initialDelay, period, TimeUnit.X); 
Cuestiones relacionadas