2011-11-27 12 views
5

Ho un semplice ruolo di Azure Worker in esecuzione che esegue un'attività ogni pochi secondi. Di seguito è riportato il codice che compie questo.Esecuzione di attività a intervalli diversi nel ruolo di Azure Worker

public override void Run() 
    { 
     try 
     { 
      while (true) 
      { 
       DoSomething(); 
       System.Threading.Thread.Sleep(3000); 
      } 

     } 
     catch (Exception ex) 
     { 
      Log.Add(ex, true); 
     }    
    } 

Quello che mi piacerebbe fare ora è aggiungere un secondo compito DoSomethingElse() che spara una volta e solo una volta al giorno. Ho pensato a un paio di modi per ottenere questo risultato:

  1. aggiungere un contatore che chiama la nuova attività ogni ciclo ennesima
  2. Aggiungere la logica condizionale per la nuova attività che mette a confronto il tempo corrente per un tempo prescritto di giorno
  3. utilizzare alcuni biblioteca TBD scheduler (come Quartz.NET)

le prime due soluzioni mi sembrano molto fragile, senza codice aggiuntivo per affrontare situazioni in cui il servizio viene arrestato e riavviato. La terza soluzione mi sembra potenzialmente eccessiva.

La mia domanda è, qual è la procedura migliore per pianificare le attività a intervalli diversi all'interno di un ruolo di Azure Worker? Ho una leggera preferenza per attaccare con .NET dritto e non usare una libreria di terze parti (anche se non lo escludo).

nota, # 3 di cui sopra deriva da questa domanda più vecchio Recommend a C# Task Scheduling Library

risposta

2

Le prime due opzioni sono i più semplici ma sono fragili - soprattutto nella nuvola in cui i ruoli possono essere riciclati/bilanciamento del carico, ecc ... Se la persistenza è in memoria o anche disco basato nel cloud, quindi sarà fragile.

Al di fuori di altre opzioni di terze parti, è possibile esaminare la permanenza della pianificazione e dei dati di esecuzione in memoria esterna (servizi tabella, sql azure, ecc.). In un timer periodico, il ruolo di lavoratore può richiedere i lavori che devono essere eseguiti, registrare l'avvio e quindi eseguire il lavoro. Ciò consente anche di ridimensionare potenzialmente il numero di ruoli dei lavoratori poiché la persistenza è esterna.

Questo può essere complicato in fretta, ma se si mantiene semplice con frequenza e tempi di registrazione, può essere abbastanza semplice.

+0

Diciamo per il momento che mantengo i dati di esecuzione in un database SQL Azure. Potrei creare un semplice controllo in DoSomethingElse() che esegue il ping del database per determinare quando l'attività è stata eseguita l'ultima volta. Ciò significherebbe eseguire il ping del database per eseguire tale controllo ogni 3 secondi. È una cattiva idea? Sono molti viaggi inutili nel database. Tuttavia, è improbabile che il server di database sia messo a dura prova da transazioni così banali. Pensieri? – hughesdan

1

Steve Marx ha scritto un bel paio di post di blog su how to build a task scheduler su Windows Azure using blob leases, penso che lo troverete molto utile.

+0

Spiega come distribuire le attività da pianificare. Ma non dice nulla su come viene attivata la logica iniziale stessa, cioè come fa un "operaio" a sapere "ora" è il momento di svegliarsi e controllare se sono programmate delle attività nella tabella? Un buon articolo come il tuo, – DeepSpace101

+0

, un ruolo di lavoratore è essenzialmente un programma in un ciclo infinito. in esso codificherebbe il controllo come desideri - presumibilmente eseguirai a un certo intervallo che ti asseconda - ogni secondo, minuto, ora, qualunque cosa e ad ogni controllo di marcia su un database di pianificazione di qualche tipo se qualcosa dovesse essere necessario. probabilmente vorrai aggiornare quel database con l'ultima volta di esecuzione e possibilmente risultato. –

Problemi correlati