Gestione delle notifiche a livello di applicazione da vari livelli dell'applicazione?

1

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?

    
posta JD Davis 06.10.2018 - 06:45
fonte

1 risposta

0

Per evitare di creare qualcosa di fatto in casa, come creare un servizio Windows che ospita SignalR. Questo servizio può guardare la tabella dei rapporti utilizzando SqlDependency e quindi notifica al client tramite SignalR una volta modificata la tabella.

L'applicazione MVC può dare il via al processo in modalità "fire and forget", il servizio Windows sarà responsabile della notifica al cliente del risultato (errore o successo). Quindi delegherà i problemi di notifica al servizio Windows. Penso che sarete in grado di prendere a schiaffi un POC in pochi minuti, forse qualche ora, per provarlo.

Poiché il servizio Windows notificherà il client, sarà necessario mappare in qualche modo la richiesta originale che è arrivata all'app MVC alla risposta. Se devi inviare la risposta a un cliente specifico, invece di trasmettere a tutti, usa questa tecnica .

    
risposta data 07.10.2018 - 17:45
fonte

Leggi altre domande sui tag