Recentemente ho iniziato ad aggiornare parti della nostra piattaforma aziendale, e ho cercato di trovare modi per rendere l'intera piattaforma più efficiente, meglio strutturata e più pulita in generale. Con SignalR finalmente pronto per la nostra versione del framework MVC, ho deciso di bagnarmi i piedi tentando di sostituire il polling in alcune parti della nostra applicazione con le notifiche SignalR. Sono riuscito a far funzionare SignalR, ma mi sono imbattuto durante la mia implementazione a causa di come avevamo codificato alcune altre funzionalità della nostra applicazione.
Il mio esempio principale è la nostra piattaforma di reporting. Disponiamo di una piattaforma di reportistica interna alla nostra applicazione in grado di eseguire report predefiniti con parametri personalizzati. Non approfondire troppo l'implementazione, ma abbiamo effettivamente una classe ReportRunner
che prende il via e gestisce l'esecuzione del report. Lo fa creando un'attività su un altro thread e avviando un'attività asincrona che non è attesa. Questa attività ha la capacità di monitorare il suo stato e aggiornare di conseguenza un record del database. Questo tiene traccia di tutte le esecuzioni, gli stati e gli errori per tutte le esecuzioni dei rapporti.
Quando si avvia un report, il runner restituisce un GUID per WebUI e continua a lavorare con l'esecuzione del report in un thread separato. Il corridore è abbastanza leggero e di breve durata, è istanziato da un'azione del controllore e processa solo il rapporto che ha consegnato e poi viene distrutto.
Il mio dilemma ruota attorno a come viene implementato questo runner di report. Poiché il report runner è una classe monouso, una volta avviato il report, smettiamo di seguirlo. Questo ha lo sfortunato effetto collaterale di noi che non conosciamo mai lo stato corrente del report senza interrogare ripetutamente il database e attendere un cambiamento di stato. Questo ovviamente può avere molti altri potenziali effetti collaterali (rapporti che non si completano mai, cicli sprecati, ecc.), Ma il principale è che non ho un modo affidabile per informare gli utenti che il loro rapporto è completo senza eseguire una sorta di polling, lato client o lato server.
Quindi l'essenza della mia domanda si riduce a questo; qual è un buon approccio alla gestione delle notifiche nell'intera applicazione senza dover legare discussioni, sondaggi o cicli?
Una delle mie prime riflessioni è stata quella di creare una sorta di "notificatore" di base o callback, una sorta di classe che potrei passare come parametro al mio ReportRunner
che potrebbe avvisare la mia WebUI quando il rapporto è stato completato. Ciò ha portato anche ad altre domande teoriche come, come potrei chiamare un metodo nella mia classe genitore, e quali sono le migliori pratiche in merito alla gestione di questo tipo di problemi? Ci sono quadri là fuori che gestiscono questo su larga scala? C'è una sorta di varianza del modello pub / sub o notifica / sottoscrizione che posso applicare a questo?