Scale-out di SignalR con RedisSignalR Scaleout with Redis

di Mike Wassonby Mike Wasson

Warning

Questa documentazione non è destinata alla versione più recente di SignalR.This documentation isn't for the latest version of SignalR. Esaminare ASP.NET Core SignalR.Take a look at ASP.NET Core SignalR.

Versioni del software usate in questo argomentoSoftware versions used in this topic

Versioni precedenti di questo argomentoPrevious versions of this topic

Per informazioni sulle versioni precedenti di SignalR, vedere SignalR versioni precedenti.For information about earlier versions of SignalR, see SignalR Older Versions.

Domande e commentiQuestions and comments

Inviare commenti e suggerimenti su come questa esercitazione è stata apprezzata e su cosa è possibile migliorare nei commenti nella parte inferiore della pagina.Please leave feedback on how you liked this tutorial and what we could improve in the comments at the bottom of the page. In caso di domande non direttamente correlate all'esercitazione, è possibile pubblicarle nel Forum di ASP.NET SignalR o in StackOverflow.com.If you have questions that are not directly related to the tutorial, you can post them to the ASP.NET SignalR forum or StackOverflow.com.

In questa esercitazione si userà Redis per distribuire i messaggi attraverso un'applicazione SignalR distribuita in due istanze separate di IIS.In this tutorial, you will use Redis to distribute messages across a SignalR application that is deployed on two separate IIS instances.

Redis è un archivio chiave-valore in memoria.Redis is an in-memory key-value store. Supporta inoltre un sistema di messaggistica con un modello di pubblicazione/sottoscrizione.It also supports a messaging system with a publish/subscribe model. Il backplane di redis di SignalR usa la funzionalità pub/sub per inviare messaggi ad altri server.The SignalR Redis backplane uses the pub/sub feature to forward messages to other servers.

Per questa esercitazione, si utilizzeranno tre server:For this tutorial, you will use three servers:

  • Due server che eseguono Windows, che si utilizzeranno per distribuire un'applicazione SignalR.Two servers running Windows, which you will use to deploy a SignalR application.
  • Un server che esegue Linux, che sarà usato per eseguire Redis.One server running Linux, which you will use to run Redis. Per le schermate di questa esercitazione, ho usato Ubuntu 12,04 TLS.For the screenshots in this tutorial, I used Ubuntu 12.04 TLS.

Se non si dispone di tre server fisici da usare, è possibile creare macchine virtuali in Hyper-V.If you don't have three physical servers to use, you can create VMs on Hyper-V. Un'altra opzione consiste nel creare macchine virtuali in Azure.Another option is to create VMs on Azure.

Anche se in questa esercitazione viene usata l'implementazione di redis ufficiale, è disponibile anche una porta di Windows Redis di MSOpenTech.Although this tutorial uses the official Redis implementation, there is also a Windows port of Redis from MSOpenTech. L'installazione e la configurazione sono diverse, ma in caso contrario i passaggi sono gli stessi.Setup and configuration are different, but otherwise the steps are the same.

Note

La scalabilità orizzontale di SignalR con Redis non supporta i cluster Redis.SignalR scaleout with Redis does not support Redis clusters.

PanoramicaOverview

Prima di arrivare all'esercitazione dettagliata, di seguito viene illustrata una rapida panoramica delle operazioni che si intende eseguire.Before we get to the detailed tutorial, here is a quick overview of what you will do.

  1. Installare Redis e avviare il server Redis.Install Redis and start the Redis server.

  2. Aggiungere i pacchetti NuGet all'applicazione:Add these NuGet packages to your application:

  3. Creare un'applicazione SignalR.Create a SignalR application.

  4. Per configurare il backplane, aggiungere il codice seguente a Startup.cs:Add the following code to Startup.cs to configure the 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-VUbuntu on Hyper-V

Con Windows Hyper-V è possibile creare facilmente una VM Ubuntu in Windows Server.Using Windows Hyper-V, you can easily create an Ubuntu VM on Windows Server.

Scaricare Ubuntu ISO da http://www.ubuntu.com.Download the Ubuntu ISO from http://www.ubuntu.com.

In Hyper-V aggiungere una nuova macchina virtuale.In Hyper-V, add a new VM. Nel passaggio Connetti disco rigido virtuale selezionare Crea un disco rigido virtuale.In the Connect Virtual Hard Disk step, select Create a virtual hard disk.

Nel passaggio Opzioni di installazione selezionare file di immagine (con estensione ISO) , fare clic su Sfogliae passare all'installazione ISO di Ubuntu.In the Installation Options step, select Image file (.iso), click Browse, and browse to the Ubuntu installation ISO.

Installare RedisInstall Redis

Per scaricare e compilare Redis, seguire la procedura descritta in http://redis.io/download .Follow the steps at http://redis.io/download to download and build 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

Questa operazione compila i file binari di redis nella directory src.This builds the Redis binaries in the src directory.

Per impostazione predefinita, Redis non richiede una password.By default, Redis does not require a password. Per impostare una password, modificare il file redis.conf che si trova nella directory radice del codice sorgente.To set a password, edit the redis.conf file, which is located in the root directory of the source code. (Creare una copia di backup del file prima di modificarlo) Aggiungere la direttiva seguente per redis.conf:(Make a backup copy of the file before you edit it!) Add the following directive to redis.conf:

requirepass YourStrongPassword1234

A questo punto, avviare il server redis:Now start the Redis server:

src/redis-server redis.conf

Aprire la porta 6379, ovvero la porta predefinita su cui Redis è in ascolto.Open port 6379, which is the default port that Redis listens on. (È possibile modificare il numero di porta nel file di configurazione).(You can change the port number in the configuration file.)

Creare l'applicazione SignalRCreate the SignalR Application

Per creare un'applicazione SignalR, seguire una di queste esercitazioni:Create a SignalR application by following either of these tutorials:

Successivamente, l'applicazione di chat verrà modificata per supportare la scalabilità orizzontale con Redis.Next, we'll modify the chat application to support scaleout with Redis. Per prima cosa, aggiungere il pacchetto NuGet Microsoft.AspNet.SignalR.StackExchangeRedis al progetto.First, add the Microsoft.AspNet.SignalR.StackExchangeRedis NuGet package to your project. In Visual Studio scegliere Gestione pacchetti NuGetdal menu strumenti e quindi selezionare console di gestione pacchetti.In Visual Studio, from the Tools menu, select NuGet Package Manager, then select Package Manager Console. Nella finestra Console di gestione pacchetti immettere il comando seguente:In the Package Manager Console window, enter the following command:

Install-Package Microsoft.AspNet.SignalR.StackExchangeRedis

Aprire quindi il file Startup.cs.Next, open the Startup.cs file. Aggiungere il codice seguente al metodo di configurazione :Add the following code to the Configuration method:

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."server" is the name of the server that is running Redis.
  • Port è il numero di portaport is the port number
  • "password" è la password definita nel file Redis. conf."password" is the password that you defined in the redis.conf file.
  • "AppName" è una stringa qualsiasi."AppName" is any string. SignalR crea un canale di pubblicazione/sottoscrizione Redis con questo nome.SignalR creates a Redis pub/sub channel with this name.

Esempio:For example:

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

Distribuire ed eseguire l'applicazioneDeploy and Run the Application

Preparare le istanze di Windows Server per la distribuzione dell'applicazione SignalR.Prepare your Windows Server instances to deploy the SignalR application.

Aggiungere il ruolo IIS.Add the IIS role. Includere le funzionalità di "sviluppo di applicazioni", incluso il protocollo WebSocket.Include "Application Development" features, including the WebSocket Protocol.

Includere anche il servizio di gestione (elencato in "strumenti di gestione").Also include the Management Service (listed under "Management Tools").

Installare Distribuzione Web 3,0.Install Web Deploy 3.0. Quando si esegue Gestione IIS, viene richiesto di installare la piattaforma Web Microsoft oppure è possibile scaricare il programma di installazione.When you run IIS Manager, it will prompt you to install Microsoft Web Platform, or you can download the installer. Nel programma di installazione della piattaforma cercare Distribuzione Web e installare Distribuzione Web 3,0In the Platform Installer, search for Web Deploy and install Web Deploy 3.0

Controllare che il servizio gestione Web sia in esecuzione.Check that the Web Management Service is running. In caso contrario, avviare il servizio.If not, start the service. Se il servizio gestione Web non è visualizzato nell'elenco dei servizi Windows, assicurarsi di aver installato il servizio di gestione quando è stato aggiunto il ruolo IIS.(If you don't see Web Management Service in the list of Windows services, make sure that you installed the Management Service when you added the IIS role.)

Per impostazione predefinita, il servizio gestione Web è in ascolto sulla porta TCP 8172.By default, the Web Management Service listens on TCP port 8172. In Windows Firewall creare una nuova regola in ingresso per consentire il traffico TCP sulla porta 8172.In Windows Firewall, create a new inbound rule to allow TCP traffic on port 8172. Per ulteriori informazioni, vedere configurazione delle regole del firewall.For more information, see Configuring Firewall Rules. Se si ospitano le macchine virtuali in Azure, è possibile eseguire questa operazione direttamente nel portale di Azure.(If you are hosting the VMs on Azure, you can do this directly in the Azure portal. Vedere come configurare gli endpoint in una macchina virtuale.See How to Set Up Endpoints to a Virtual Machine.)

A questo punto si è pronti per distribuire il progetto di Visual Studio dal computer di sviluppo al server.Now you are ready to deploy the Visual Studio project from your development machine to the server. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere pubblica.In Solution Explorer, right-click the solution and click Publish.

Per informazioni più dettagliate sulla distribuzione Web, vedere la pagina relativa alla mappa del contenuto della distribuzione Web per Visual Studio e ASP.NET.For more detailed documentation about web deployment, see Web Deployment Content Map for Visual Studio and ASP.NET.

Se si distribuisce l'applicazione in due server, è possibile aprire ogni istanza in una finestra del browser separata e verificare che ognuno riceva i messaggi di SignalR dall'altro.If you deploy the application to two servers, you can open each instance in a separate browser window and see that they each receive SignalR messages from the other. Naturalmente, in un ambiente di produzione, i due server si trovano dietro un servizio di bilanciamento del carico.(Of course, in a production environment, the two servers would sit behind a load balancer.)

Se si è curiosi di visualizzare i messaggi inviati a Redis, è possibile usare il client Redis-CLI , che viene installato con Redis.If you're curious to see the messages that are sent to Redis, you can use the redis-cli client, which installs with Redis.

redis-cli -a password
SUBSCRIBE ChatApp