2012-04-16 12 views
12

Ich bin auf der Suche nach einem skalierbaren "at" Ersatz, mit hoher Verfügbarkeit. Es muss das Hinzufügen und Entfernen von Jobs zur Laufzeit unterstützen.Auf der Suche nach einer skalierbaren "at" Implementierung

Einige Hintergrund: Ich habe eine Anwendung, wo ich Millionen von Ereignissen auslösen, jedes Ereignis tritt nur einmal auf. Ich brauche keine cronähnlichen Mechanismen (erster Sonntag im Monat, etc.), einfach Datum, Zeit und Kontext.

Derzeit verwende ich die Quartz scheduler, und obwohl es ein sehr gutes Projekt ist, hat es Schwierigkeiten, die Menge der Ereignisse, die wir werfen, auch nach vielen Feinabstimmungen (Sharting, Erhöhung der Abfrageintervall, etc.)) aufgrund der Grundsperrung in der Unterstreichungsdatenbank ausgeführt wird. Außerdem ist es für uns etwas übertrieben, da wir im Grunde Millionen von Einmalauslösern und eine relativ kleine Anzahl von Jobs haben.

würde ich jeden Vorschlag

+0

Was sind Ihre Anforderungen rund um Scheitern? Wenn zum Beispiel eine Maschine ausfällt, möchten Sie, dass die "verpassten" Ereignisse ausgelöst werden, wenn ein Ersatz ausgelöst wird? –

+0

Ja, ähnlich wie Quarz. Außerdem liefere ich Quartz in einem Cluster, so dass immer eine warme Maschine wartet (in Quartz konkurrieren alle Knoten jedes Mal, wenn sie die DB nach Jobs abfragen müssen) –

+0

Ich habe mich gerade gefragt, wie einfach wir Dinge * ohne * Quartz machen können. Wenn jedoch jeder Auftrag bestätigt werden muss, ist das schwieriger. Was ist die Strafe, wenn ein Job zweimal ausgeführt wird? (Könnten Sie beispielsweise alle Jobs, die in der letzten Minute ausgeführt wurden, einmal pro Minute bestätigen?) –

Antwort

0

schätzen Vielleicht durch Ausführungszeit verwenden nur Aufgaben JGroupsshared tree mit sortiert. Die Knoten übernehmen die erste Aufgabe und planen den Timer, der zu gegebener Zeit ausgeführt wird. Ein Task-Entfernungs-Timer kann abgebrochen werden. Also im Grunde können Sie nur JGroups und einfache Java-Timer/Executors verwenden.

Ich habe es nicht gelesen ganze, aber hier ist einige proof of concept or maybe even solution

0

wie über die Java-Timer?

import java.util.*; 

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

und dann

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. Es überlebt den Prozessneustart nicht; 2. Wie skalierst du es auf Millionen von Jobs? Dies ist, was Quartz zu lösen versucht –

+0

1. Sie haben nicht erwähnt, Persistenz ist eine Voraussetzung; 2. Sie sagten, dass es relativ wenige Arbeitsplätze gibt. – kromit

+0

Es tut mir leid, aber ich habe "Hohe Verfügbarkeit" und "Millionen von Ereignissen/Millionen von einmaligen Auslösern" erwähnt ... –

1

Wenn ich das gleiche Szenario mit Blick war ich folgende ...

-Setup eine JMS-Warteschlange Cluster (zB RabbitMQ oder ActiveMQ) unter Verwendung einer Warteschlange Replikation tun würde Setup über ein paar Boxen.

Feuer alle Ereignisse in meiner schönen hoch verfügbaren JMS-Warteschlange.

Dann würde ich einen Agenten Anwendungscode, der die Ereignisse der JMS-Warteschlange tauchte nach Bedarf, konnte ich mehrere Agenten auf mehreren Boxen laufen und haben, dass mit dem richtigen JMS-Failover-URL kombiniert usw.

Sie auch nutzen könnten die gleiche Art von Modell, wenn Ihre Jobs die Ereignisse feuern ...

Fyi, eine schönere Art und Weise der Planung in Kern Java ist wie folgt:

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