Attività a tempo sempre in esecuzione

1

Ho bisogno di progettare un software che invochi alcune azioni regolarmente. Con regolarità intendo dire che ci sono x cose che devono essere fatte alle 12.00, cose alle 12.30 ecc. Ecc.

Gli orari e le date sono accessibili dal DB.

La mia domanda è: quale sarebbe l'approccio migliore per gestire la natura inarrestabile dell'app?

La soluzione ovvia sarebbe un ciclo infinito con un timer e lo stato della registrazione dell'app. Se il processo muore, iniziamo l'ultima voce. È importante che anche se il processo muore quando è il momento di fare qualcosa, lo facciamo ancora quando è stato riavviato.

Esistono approcci più intelligenti a questo?

Il Class: Concurrent :: TimerTask di Ruby potrebbe essere un vero vantaggio come meccanismo di temporizzazione (oltre ad essere multi-thread)?

    
posta kaboom 23.10.2015 - 12:39
fonte

1 risposta

9

Devi stare attento con questo tipo di sistema distribuito. Ad esempio: immagina di avere un server di attivazione a Londra e un altro a New York. Se una Deep One taglia il cavo tra di loro, Londra penserà che "NY è andato giù, devo prendere il sopravvento", e NY penserà che "Londra è finita, devo subentrare" ... e la tua applicazione verrà attivata due volte. Ciò significa che devi avere almeno 3 server in modo che uno possa agire da monitor per gli altri per arbitrare se sono disconnessi l'uno dall'altro o davvero giù.

Spesso in tali situazioni, uno funge da master e l'altro è in standby, quindi solo uno è effettivamente in esecuzione in qualsiasi momento. Quando lo standby rileva che il master non risponde più (ad esempio agli heartbeat), diventa il master e prende il sopravvento.

Questo suppone che l'applicazione da attivare sia distribuita in modo simile - nessuna buona Londra sta tentando di eseguire un'app sul server NY se il server NY ha fallito.

Naturalmente, suppone anche che il tuo DB sia accessibile da entrambi i server, il mancato contatto con il DB fa sì che il server master attualmente in esecuzione si consideri disconnesso e cada intenzionalmente, e ciò significa che anche il tuo DB deve essere resiliente (o potresti inoltre esegui il server di attivazione sul server DB stesso.

I sistemi completamente tolleranti ai guasti e distribuiti non sono semplici da ottenere. Puoi ottenere l'80% del servizio richiesto abbastanza facilmente, mentre l'altro 20% è davvero difficile. ZeroMQ ha una buona documentazione architettonica riguardante la topologia della rete che è molto buona da leggere e ti aiuterà a capire quale tipo di errore tolleranza che potresti desiderare.

Dato che, forse tutto ciò di cui hai veramente bisogno è uno script perl servito da localhost che venga eseguito regolarmente e che ricordi l'ultima volta che è stato eseguito. Per quanto tempo puoi tollerare tra il momento in cui qualcosa dovrebbe essere eseguito e quando lo fa? Se quel tempo è maggiore del tempo di riavvio di un server, c'è la tua soluzione semplice ma efficace. Se hai bisogno di risposte assolute di secondo-secondo con disponibilità del 99,999% - beh, diciamo che l'autore di ZeroMQ probabilmente ha ancora un grande buco dietro la sua casa che potrebbe ancora essere trasformato in una piscina executive.

    
risposta data 29.10.2015 - 17:34
fonte

Leggi altre domande sui tag