Se avevi un'attività che volevi eseguire solo una volta su un cluster di server, a intervalli regolari quale sarebbe il modo migliore per raggiungere questo obiettivo? La definizione di cluster in questo caso è 2 o più server identici con sessioni distribuite posizionate dietro un servizio di bilanciamento del carico.
Caso di utilizzo: hai un'attività che è costosa da eseguire che dovrebbe essere eseguita una volta ogni X ore. Questo lavoro potrebbe ad esempio scorrere su un gruppo di record e aggiornare il loro stato.
- Lo scenario peggiore è che l'esecuzione del lavoro invalida due volte i dati.
- Il caso migliore è che il lavoro utilizzi le risorse su tutti i tuoi server.
Riepilogo dei requisiti:
- Il lavoro deve ancora essere eseguito anche se uno dei nodi è inattivo.
- Il lavoro deve essere eseguito solo una volta per programma.
- Se più processi vengono pianificati contemporaneamente o in momenti di sovrapposizione, il numero di lavori in esecuzione viene distribuito equamente tra i server.
- Le macchine devono avere lo stesso codice base e essere sincronizzate tramite NTP.
- La configurazione può variare tra nodo e nodo, in base alle variabili di ambiente.
- Il lavoro deve iniziare in tempo o entro un determinato intervallo del tempo assegnato. (diciamo 5 minuti per esempio)
Possibili soluzioni
- Imposta un nodo come nodo principale, questo non funziona in quanto viola il precedente 1.
- Effettuare una richiesta di bilanciamento del bilanciamento del carico per avviare il lavoro. Sfortunatamente, questo ha l'effetto collaterale che se hai più processi in esecuzione nello stesso momento, potrebbero essere tutti eseguiti dallo stesso computer.
Questo dovrebbe essere eseguito in Java, in un contenitore di servlet. Tuttavia non sta codificando i lavori che sto cercando.
Sicuramente questo è un problema risolto con la soluzione migliore conosciuta.
Domanda correlata link
Questo non è un duplicato in quanto la soluzione è insufficiente come da quei 5 requisiti sopra riportati. La soluzione più upvoted soffre di un problema di gara e la seconda soluzione viola il requisito 3