2012-04-16 12 views
12

Sto cercando una sostituzione "a" scalabile, con disponibilità elevata. Deve supportare l'aggiunta e la rimozione di processi in fase di esecuzione.Ricerca di un'implementazione scalabile "a"

Alcuni background: Ho un'applicazione in cui attingo milioni di eventi, ogni evento si verifica solo una volta. Non ho bisogno di meccanismi come cron (prima domenica del mese, ecc.), Semplicemente data, ora e contesto.

Attualmente sto usando lo Quartz scheduler e, sebbene sia un ottimo progetto, ha difficoltà a gestire la quantità di eventi che lanciamo su di esso, anche dopo un sacco di tweaking (sharding, aumento dell'intervallo di polling, ecc.) a causa del blocco di base eseguito sul database di sottolineatura. Inoltre, è un po 'eccessivo per noi, in quanto fondamentalmente abbiamo milioni di trigger una tantum e un numero relativamente piccolo di lavori.

Apprezzerei tutto suggerimento

+0

Quali sono i requisiti di tutto il fallimento? Ad esempio, se una macchina si arresta, vorresti che gli eventi "mancati" si attivino quando viene visualizzata una sostituzione? –

+0

Sì, simile al quarzo. Inoltre, eseguo Quartz in un cluster, quindi c'è sempre una macchina calda in attesa (in Quartz tutti i nodi competono ogni volta che hanno bisogno di interrogare il DB per i lavori) –

+0

Mi stavo chiedendo quanto fosse semplice fare le cose * senza * Quartz. Se ogni lavoro deve essere riconosciuto, ciò lo rende più complicato. Qual è la penalità se un lavoro viene eseguito due volte? (Ad esempio, potresti riconoscere tutti i lavori eseguiti all'ultimo minuto, una volta al minuto?) –

risposta

0

Forse basta usare JGroupsshared tree con compiti ordinati per tempo di esecuzione. I nodi eseguiranno il primo compito e programmano il timer, che verrà eseguito in un dato momento. Il timer di rimozione dell'attività può essere annullato. Quindi in pratica puoi usare solo JGroups e semplici Timer/Esecutori java.

non l'ho letto tutto, ma qui è una certa proof of concept or maybe even solution

0

come circa il timer Java?

import java.util.*; 

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

e poi

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. Non sopravvive al riavvio del processo; 2. Come lo ridimensiona a milioni di posti di lavoro? Questo è ciò che Quartz mira a risolvere –

+0

1. Non hai menzionato che la persistenza è un requisito; 2. Hai detto che ci sono relativamente pochi posti di lavoro. – kromit

+0

Mi dispiace, ma ho menzionato "Alta disponibilità" e "Milioni di eventi/Milioni di attivatori unici" ... –

1

Se ero di fronte lo stesso scenario che vorrei fare le seguenti ...

Setup una coda cluster JMS (ad es RabbitMQ o ActiveMQ) utilizzando una replica di coda installazione su poche caselle.

Attivare tutti gli eventi nella mia bella coda JMS altamente disponibile.

Poi vorrei codificare un'applicazione agente che mi è venuta gli eventi della coda JMS, se necessario, ho potuto eseguire più agenti su più caselle e che hanno combinato con la corretta JMS failover url ecc

Si potrebbe anche usare lo stesso tipo di modello, se i lavori stanno sparando gli eventi ...

Cordiali saluti, un modo migliore di programmazione in Java di base è la seguente:

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);