2011-07-12 5 views
14

Ho uno strato di server di applicazioni identici dietro un servizio di bilanciamento del carico. Per ragioni operative, ho il vincolo che la configurazione dell'applicazione su entrambi i server delle app debba essere identica, in modo che i nodi possano essere facilmente aggiunti e rimossi. Tutti i server delle app condividono lo stesso database. I server di app non sono/non saranno raggruppati.Utilizzo del quarzo per pianificare un singolo lavoro su più server di app stateless

Questo ha funzionato bene fino ad ora, ma ora mi piacerebbe avere un lavoro pianificato che si esegue esattamente su uno dei server di app. Tutti i server delle app eseguiranno Quartz e avranno la stessa pianificazione per i lavori in esecuzione. Il trigger si attiverà su ogni server delle app, ma vorrei che solo un app server eseguisse effettivamente il lavoro - in sostanza, tutti corrono per avviarsi e ne viene avviato solo uno, i restanti app server ignorano il lavoro. L'idea è che se perdiamo un app server, un altro eseguirà il lavoro, e se aggiungiamo nuovi server di app, prenderanno il turno ai lavori in esecuzione.

Avevo intenzione di fare questo avendo una tabella 'job lock' nel database che tutti i server di app avrebbero letto prima di iniziare un lavoro e iniziare solo se il lavoro è 'sbloccato'. Il server delle app che rende l'aggiornamento primo sulla tabella bloccherà essenzialmente gli altri aggiornando la tabella a uno stato di esecuzione/reimpostandola alla fine del lavoro.

Prima costruisco questo, mi farebbe piacere qualche input da quelli con più esperienza di quarzo:

a) Posso agganciare questo comportamento in quarzo in modo che non deve essere fatto su una base per lavoro base? Cioè gli sviluppatori possono aggiungere nuovi posti di lavoro senza doversi preoccupare del blocco dei processi in quanto viene sottratto.

b) Quartz fornisce meccanismi integrati per ottenere qualcosa di simile a sopra, quindi non devo farlo da solo?

Grazie!

risposta

18

Pensi che questo funzioni per te? http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering

Estratto dal link

clustering attualmente funziona solo con il JDBC-Jobstore (JobStoreTX o JobStoreCMT), e sostanzialmente funziona avendo ogni nodo del cluster condividono lo stesso database.

Il bilanciamento del carico si verifica automaticamente, con ogni nodo del cluster che attiva i lavori il più rapidamente possibile. Quando si verifica il tempo di sparo di un trigger, il primo nodo ad acquisirlo (ponendo un blocco su di esso) è il nodo che lo spara.

+0

Non so come mi sono perso:/Grazie. – Scruffers

+0

Se trovi utile la mia risposta, non dimenticare di contrassegnarla come "risposta accettata" – Sap

+0

Il clustering con Quartz è quello per l'ambiente cluster, –