Abilitare gli aggiornamenti automatici in un'applicazione Web con il Servizio SignalR

Completato

Applicazione Web basata su polling.

A questo punto si mette da parte il polling e si prende in esame un'app che esegue il push degli aggiornamenti dei dati (appena si verificano) ai client connessi. Questa nuova progettazione riduce il traffico e rende più efficiente l'interfaccia utente, eseguendo l'aggiornamento solo in seguito alla modifica dei dati. Le tre tecnologie che vengono usate per creare questa soluzione aggiornata sono Azure Cosmos DB, Funzioni di Azure e SignalR.

  • Azure Cosmos DB: Quando i dati vengono modificati nel database, Azure Cosmos DB espone un feed di modifiche. Il supporto del feed di modifiche in Azure Cosmos DB è in ascolto di eventuali modifiche in un contenitore del database. Restituisce quindi l'elenco dei documenti cambiati nell'ordine in cui sono stati modificati. Quando l'applicazione riceve il feed di modifica, può rispondere automaticamente alle modifiche dei dati.

  • Funzioni di Azure: La differenza principale tra questa funzione e la funzione getStocks originale è che la funzione viene ora attivata in base alle modifiche ai dati. Nell'esercizio precedente la funzione veniva attivata in base alle richieste del client e si eseguiva il pull di tutti i dati tramite un'associazione di input di Azure Cosmos DB. L'uso del trigger di Azure Cosmos DB rende automaticamente più efficiente il recupero dati. Funzioni di Azure include un'associazione che esegue il codice ogni volta che i dati vengono aggiornati in un feed di modifiche di Azure Cosmos DB. Una volta che una funzione è in ascolto del feed di modifiche, è possibile lavorare con un subset dei dati che rappresenta solo le modifiche apportate.

  • Azure SignalR: Questo servizio fornisce comunicazioni bidirezionali con una connessione SignalR sul client in ascolto delle trasmissioni SignalR dall'app Funzioni di Azure.

SignalR e connessioni persistenti

A differenza del polling, una progettazione più favorevole include connessioni persistenti tra client e server. La definizione di una connessione persistente consente al server di eseguire il push dei dati al client in base alle esigenze. La natura on demand della connessione riduce il traffico di rete e il carico del server. SignalR consente di aggiungere facilmente questo tipo di architettura all'applicazione.

SignalR è un'astrazione di una serie di tecnologie che consente all'app di usufruire della comunicazione bidirezionale tra client e server. SignalR gestisce automaticamente la gestione delle connessioni e consente di trasmettere messaggi a tutti i client connessi contemporaneamente, come in una chat room. È anche possibile inviare messaggi a client specifici. La connessione tra client e server è persistente, a differenza di una connessione HTTP classica, che viene ristabilita per ogni comunicazione.

Un vantaggio essenziale dell'astrazione fornita da SignalR è il modo in cui supporta i fallback di "trasporto". Un trasporto è un metodo di comunicazione tra client e server. Le connessioni SignalR iniziano con una richiesta HTTP standard. Mentre il server valuta la connessione, viene selezionato il metodo di comunicazione (trasporto) più appropriato. Quando è associata a una connessione persistente al client, la funzione può contattare i singoli client on demand, che costituisce la base per un'architettura dell'applicazione in tempo reale. I trasporti vengono scelti a seconda delle API disponibili nel client:

  • HTML 5: Per i client che supportano HTML 5, per impostazione predefinita viene usato il trasporto API WebSocket.
  • WebSocket: Se il client non supporta i WebSocket, SignalR esegue il fallback agli eventi inviati dal server (noti anche come EventSource).
  • Altra tecnologia: Per i client meno recenti, viene usato il polling prolungato Ajax o Forever Frame (solo per Internet Explorer) per simulare una connessione bidirezionale.

Il livello di astrazione offerto da SignalR offre due vantaggi all'applicazione. Il primo è costituito dall'investimento solido per il futuro che rappresenta per l'app. Di pari passo con l'evoluzione del Web e la disponibilità di API di livello superiore a WebSocket, l'applicazione non necessita comunque di modifiche. Puoi eseguire l'aggiornamento a una versione di SignalR che supporta nuove API senza modificare il codice dell'applicazione.

Il secondo vantaggio è che SignalR consente all'applicazione di ridurre le prestazioni in modo graduale a seconda delle tecnologie supportate del client. Se non supporta i WebSocket, vengono usati gli eventi inviati dal server. Se il client non riesce a gestire gli eventi inviati dal server, viene usato il polling prolungato Ajax e così via.

Ecco come usare SignalR per trasmettere informazioni da una funzione che legge il feed di modifiche di Azure Cosmos DB.