Il titolo della mia domanda è generale perché ritengo che questo problema sia di natura generale, ma per impostare il livello fornirò un esempio specifico.
Utilizziamo un motore di flusso di lavoro locale che è guidato dalle tabelle del database. All'interno di queste tabelle si nasconde un grafico diretto che rappresenta il flusso di lavoro. Il grafico contiene fasi e attività; viene tracciata una linea tra due nodi Stage e il nodo Attività risultante contiene il codice da eseguire. Usiamo CSScript per compilare ed eseguire il codice al volo.
All'interno del flusso di lavoro, i record di attività rappresentano il lavoro da eseguire. Ogni attività contiene alcuni metadati rilevanti in formato XML. I record delle attività attraversano il grafico diretto e il codice viene eseguito mentre l'attività passa attraverso l'attività. Quindi in ogni momento, ogni fase potrebbe contenere x numero di compiti, in attesa di essere eseguiti su un'attività.
Per eseguire un'attività su un'attività, è necessario programmarla. Un record di pianificazione contenente un datetime, un taskid, stageid e activityid determina quando e dove questa operazione verrà eseguita successivamente. Periodicamente, eseguiamo una query che restituisce i record di pianificazione dovuti, quindi, per ogni record restituito, alziamo un'istanza di attività e la eseguiamo, assegnandole il record dell'attività come parametro.
Questa query era utilizzata per eseguire 10 volte al secondo. Di recente, ho aggiunto un codice che conta quante volte la query non restituisce alcun record e, se questo conteggio arriva a 60, riduco l'intervallo di query a una volta al secondo e ricomincio a contare. Se il conteggio raggiunge ancora 60, riduca l'intervallo a una volta al minuto. Se viene visualizzato un record nel risultato della query, imposto l'intervallo su 10 volte al secondo e ricomincio il processo di conteggio. L'effetto netto è che la tabella degli orari viene rapidamente interrogata durante i periodi di attività intensa e viene sottoposta a sondaggi scarsamente durante i periodi di tranquillità. Ci aspettiamo di risparmiare poche centinaia di dollari per istanza di Azure al mese, solo da questa semplice modifica.
Quindi ecco la mia domanda.
Questo è ovviamente un modello di sondaggio. C'è un modo per renderlo "event-driven," in modo che il database venga colpito solo quando è necessario un record di pianificazione, senza dover eseguire il polling continuo del database?