Scale-out di SignalR con Redis

Avviso

Questa documentazione non è per la versione più recente di SignalR. Esaminare ASP.NET Core SignalR.

Versioni software usate in questo argomento

Versioni precedenti di questo argomento

Per informazioni sulle versioni precedenti di SignalR, vedere Versioni precedenti di SignalR.

Domande e commenti

Lasciare commenti e suggerimenti su come è piaciuta questa esercitazione e ciò che è possibile migliorare nei commenti nella parte inferiore della pagina. Se si hanno domande che non sono direttamente correlate all'esercitazione, è possibile pubblicarli nel forum ASP.NET SignalR o StackOverflow.com.

In questa esercitazione si userà Redis per distribuire messaggi in un'applicazione SignalR distribuita in due istanze IIS separate.

Redis è un archivio chiave-valore in memoria. Supporta anche un sistema di messaggistica con un modello di pubblicazione/sottoscrizione. Il backplane SignalR Redis usa la funzionalità pub/sub per inoltrare messaggi ad altri server.

Diagramma che mostra le frecce che passano da Redis Server a V M e quindi ai computer. Una freccia etichettata Pubblica passa da V M a Redis Server.

Per questa esercitazione si useranno tre server:

  • Due server che eseguono Windows, che verrà usato per distribuire un'applicazione SignalR.
  • Un server che esegue Linux, che verrà usato per eseguire Redis. Per gli screenshot di questa esercitazione, ho usato Ubuntu 12.04 TLS.

Se non si dispone di tre server fisici da usare, è possibile creare macchine virtuali in Hyper-V. Un'altra opzione consiste nel creare macchine virtuali in Azure.

Anche se questa esercitazione usa l'implementazione ufficiale di Redis, esiste anche una porta Di Windows di Redis da MSOpenTech. La configurazione e la configurazione sono diverse, ma in caso contrario, i passaggi sono uguali.

Nota

La scalabilità di SignalR con Redis non supporta i cluster Redis.

Panoramica

Prima di passare all'esercitazione dettagliata, ecco una rapida panoramica di ciò che si farà.

  1. Installare Redis e avviare il server Redis.

  2. Aggiungere questi pacchetti NuGet all'applicazione:

  3. Creare un'applicazione SignalR.

  4. Aggiungere il codice seguente a Startup.cs per configurare il backplane:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
            app.MapSignalR();
        }
    }
    

Ubuntu in Hyper-V

Usando Windows Hyper-V, è possibile creare facilmente una macchina virtuale Ubuntu in Windows Server.

Scaricare l'ISO Ubuntu da http://www.ubuntu.com.

In Hyper-V aggiungere una nuova macchina virtuale. Nel passaggio Connettidisco rigido virtuale selezionare Crea un disco rigido virtuale.

Screenshot che mostra la finestra di dialogo Creazione guidata nuova macchina virtuale. Connettere disco rigido virtuale e creare un disco rigido virtuale sono selezionati.

Nel passaggio Opzioni di installazione selezionare File immagine (con estensione iso), fare clic su Sfoglia e passare all'ISO di installazione ubuntu.

Screenshot che mostra la Creazione guidata nuova macchina virtuale nella pagina Opzioni di installazione. Installare un file O S da un ROM D D D D d di avvio e il punto di file immagine i o sono selezionati.

Installare Redis

Seguire i passaggi in per http://redis.io/download scaricare e compilare Redis.

wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar xzf redis-2.6.12.tar.gz
cd redis-2.6.12
make

In questo modo vengono compilati i file binari Redis nella src directory.

Per impostazione predefinita, Redis non richiede una password. Per impostare una password, modificare il redis.conf file, che si trova nella directory radice del codice sorgente. (Creare una copia di backup del file prima di modificarla!) Aggiungere la direttiva seguente a redis.conf:

requirepass YourStrongPassword1234

Avviare ora il server Redis:

src/redis-server redis.conf

Screenshot che mostra la pagina principale del server Redis.

Aprire la porta 6379, ovvero la porta predefinita in ascolto di Redis. È possibile modificare il numero di porta nel file di configurazione.

Creare l'applicazione SignalR

Creare un'applicazione SignalR seguendo una di queste esercitazioni:

Verrà quindi modificata l'applicazione chat per supportare il scaleout con Redis. Aggiungere innanzitutto il Microsoft.AspNet.SignalR.StackExchangeRedis pacchetto NuGet al progetto. In Visual Studio, dal menu Strumenti selezionare Gestione pacchetti NuGet, quindi selezionare Console di Gestione pacchetti. Nella finestra Console di gestione pacchetti immettere il comando seguente:

Install-Package Microsoft.AspNet.SignalR.StackExchangeRedis

Aprire quindi il file Startup.cs. Aggiungere il codice seguente al metodo Configuration :

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
        GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
        app.MapSignalR();
    }
}
  • "server" è il nome del server che esegue Redis.
  • porta è il numero di porta
  • "password" è la password definita nel file redis.conf.
  • "AppName" è qualsiasi stringa. SignalR crea un canale pub/sub Redis con questo nome.

Ad esempio:

GlobalHost.DependencyResolver.UseStackExchangeRedis("redis-server.cloudapp.net", 6379,
    "MyStrongPassword1234", "ChatApp");

Distribuire ed eseguire l'applicazione

Preparare le istanze di Windows Server per distribuire l'applicazione SignalR.

Aggiungere il ruolo IIS. Includere le funzionalità "Sviluppo applicazioni", incluso il protocollo WebSocket.

Screenshot che mostra Aggiungi ruoli e funzionalità guidata. Vengono selezionati ruoli server e Protocollo WebSocket.

Includere anche il servizio di gestione (elencato in "Strumenti di gestione").

Screenshot che mostra Aggiungi ruoli e funzionalità guidata. Il servizio di gestione è selezionato.

Installare Distribuzione Web 3.0. Quando si esegue Gestione IIS, verrà richiesto di installare Piattaforma Web Microsoft oppure scaricare il programma di installazione. Nel programma di installazione della piattaforma cercare Distribuzione Web e installare Distribuzione Web 3.0

Screenshot che mostra la finestra di dialogo Programma di installazione piattaforma Web 4 punto 5. Distribuzione Web 3 punti 0 è selezionata.

Verificare che il servizio gestione Web sia in esecuzione. In caso contrario, avviare il servizio. Se non viene visualizzato il servizio gestione Web nell'elenco dei servizi Windows, assicurarsi di aver installato il servizio di gestione quando è stato aggiunto il ruolo IIS.

Per impostazione predefinita, il servizio Gestione Web è in ascolto sulla porta TCP 8172. In Windows Firewall creare una nuova regola in ingresso per consentire il traffico TCP sulla porta 8172. Per altre informazioni, vedere Configurazione delle regole del firewall. Se si ospitano le macchine virtuali in Azure, è possibile eseguire questa operazione direttamente nella portale di Azure. Vedere Come configurare gli endpoint in una macchina virtuale.

A questo momento è possibile distribuire il progetto di Visual Studio dal computer di sviluppo al server. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere Pubblica.

Per una documentazione più dettagliata sulla distribuzione Web, vedere Mappa contenuto distribuzione Web per Visual Studio e ASP.NET.

Se si distribuisce l'applicazione in due server, è possibile aprire ogni istanza in una finestra del browser separata e vedere che ogni utente riceve messaggi SignalR dall'altro. Naturalmente, in un ambiente di produzione, i due server si trovano dietro un servizio di bilanciamento del carico.

Screenshot di due finestre del browser aperte che mostrano l'applicazione distribuita in due server.

Se si è curiosi di visualizzare i messaggi inviati a Redis, è possibile usare il client redis-cli , che installa con Redis.

redis-cli -a password
SUBSCRIBE ChatApp

Screenshot che mostra un elenco numerato in una finestra Redis.