Horizontale Skalierung in SignalR mit Redis (SignalR 1.x)

von Patrick Fletcher

Warnung

Diese Dokumentation ist nicht für die neueste Version von SignalR vorgesehen. Sehen Sie sich ASP.NET Core SignalR an.

In diesem Tutorial verwenden Sie Redis , um Nachrichten auf eine SignalR-Anwendung zu verteilen, die auf zwei separaten IIS-Instanzen bereitgestellt wird.

Redis ist ein Schlüssel-Wert-Speicher im Arbeitsspeicher. Außerdem wird ein Messagingsystem mit einem Veröffentlichungs-/Abonnementmodell unterstützt. Die SignalR Redis-Backplane verwendet die Funktion pub/sub, um Nachrichten an andere Server weiterzuleiten.

Diagramm, das die Beziehung zwischen Redis Server veranschaulicht, der V Ms abonniert, Computer, die dann V Ms auf Redis-Servern veröffentlichen.

In diesem Tutorial verwenden Sie drei Server:

  • Zwei Server unter Windows, die Sie zum Bereitstellen einer SignalR-Anwendung verwenden.
  • Ein Linux-Server, den Sie zum Ausführen von Redis verwenden. Für die Screenshots in diesem Tutorial habe ich Ubuntu 12.04 TLS verwendet.

Wenn Sie nicht über drei physische Server verfügen, können Sie VMs auf Hyper-V erstellen. Eine weitere Möglichkeit besteht darin, VMs in Azure zu erstellen.

Obwohl in diesem Tutorial die offizielle Redis-Implementierung verwendet wird, gibt es auch einen Windows-Port von Redis von MSOpenTech. Setup und Konfiguration unterscheiden sich, aber andernfalls sind die Schritte identisch.

Hinweis

Die SignalR-Skalierung mit Redis unterstützt keine Redis-Cluster.

Übersicht

Bevor wir mit dem ausführlichen Tutorial beginnen, finden Sie hier eine kurze Übersicht über ihre Aufgaben.

  1. Installieren Sie Redis, und starten Sie den Redis-Server.

  2. Fügen Sie Ihrer Anwendung die folgenden NuGet-Pakete hinzu:

  3. Erstellen Sie eine SignalR-Anwendung.

  4. Fügen Sie global.asax den folgenden Code hinzu, um die Backplane zu konfigurieren:

    protected void Application_Start()
    {
        GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
    
        RouteTable.Routes.MapHubs();
        // ...
    }
    

Ubuntu unter Hyper-V

Mit Windows Hyper-V können Sie ganz einfach eine Ubuntu-VM unter Windows Server erstellen.

Laden Sie die Ubuntu-ISO von herunter http://www.ubuntu.com.

Fügen Sie in Hyper-V einen neuen virtuellen Computer hinzu. Wählen Sie im Schritt Virtuelle Festplatte verbinden die Option Virtuelle Festplatte erstellen aus.

Screenshot des Assistenten für neue virtuelle Computer, in dem der Bereich Virtuelle Festplatte verbinden und das Feld Name hervorgehoben sind.

Wählen Sie im Schritt Installationsoptionendie Option Imagedatei (.iso) aus, klicken Sie auf Durchsuchen, und navigieren Sie zur ISO-Datei für die Ubuntu-Installation.

Screenshot des Assistenten für neue virtuelle Computer mit hervorgehobenem Bereich

Installieren von Redis

Führen Sie die Schritte unter aus http://redis.io/download , um Redis herunterzuladen und zu erstellen.

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

Dadurch werden die Redis-Binärdateien im src Verzeichnis erstellt.

Standardmäßig erfordert Redis kein Kennwort. Bearbeiten Sie zum Festlegen eines Kennworts die redis.conf Datei, die sich im Stammverzeichnis des Quellcodes befindet. (Erstellen Sie eine Sicherungskopie der Datei, bevor Sie sie bearbeiten!) Fügen Sie die folgende -Direktive zu hinzu redis.conf:

requirepass YourStrongPassword1234

Starten Sie nun den Redis-Server:

src/redis-server redis.conf

Screenshot des Fensters

Öffnen Sie Port 6379. Dies ist der Standardport, an dem Redis lauscht. (Sie können die Portnummer in der Konfigurationsdatei ändern.)

Erstellen der SignalR-Anwendung

Erstellen Sie eine SignalR-Anwendung, indem Sie eines der folgenden Tutorials ausführen:

Als Nächstes ändern wir die Chatanwendung, um horizontales Skalieren mit Redis zu unterstützen. Fügen Sie zunächst ihrem Projekt das NuGet-Paket SignalR.Redis hinzu. Wählen Sie in Visual Studio im Menü Extras die Option NuGet-Paket-Manager und dann Paket-Manager-Konsole aus. Geben Sie im Fenster Paket-Manager-Konsole den folgenden Befehl ein:

Install-Package Microsoft.AspNet.SignalR.Redis

Öffnen Sie als Nächstes die Datei Global.asax. Fügen Sie der Application_Start-Methode den folgenden Code hinzu:

protected void Application_Start()
{
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");

    RouteTable.Routes.MapHubs();
}
  • "server" ist der Name des Servers, auf dem Redis ausgeführt wird.
  • Port ist die Portnummer.
  • "password" ist das Kennwort, das Sie in der Datei redis.conf definiert haben.
  • "AppName" ist eine beliebige Zeichenfolge. SignalR erstellt einen Redis pub/sub-Kanal mit diesem Namen.

Beispiel:

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

Bereitstellen und Ausführen der Anwendung

Bereiten Sie Ihre Windows Server-Instanzen für die Bereitstellung der SignalR-Anwendung vor.

Fügen Sie die IIS-Rolle hinzu. Schließen Sie Features für die Anwendungsentwicklung ein, einschließlich des WebSocket-Protokolls.

Screenshot des Assistenten zum Hinzufügen von Rollen und Features mit hervorgehobenen Optionen für Serverrollen und Web Socket-Protokoll

Schließen Sie auch den Verwaltungsdienst (aufgeführt unter "Verwaltungstools") ein.

Screenshot des Assistenten zum Hinzufügen von Rollen und Features mit hervorgehobenen Optionen für Serverrollen und IOS-Verwaltungsskripts und -tools

Installieren Sie Web Deploy 3.0. Wenn Sie IIS-Manager ausführen, werden Sie aufgefordert, Microsoft-Webplattform zu installieren, oder Sie können das Installationsprogramm herunterladen. Suchen Sie im Plattforminstallationsprogramm nach Web Deploy, und installieren Sie Web Deploy 3.0.

Screenshot des Bildschirms

Überprüfen Sie, ob der Webverwaltungsdienst ausgeführt wird. Wenn nicht, starten Sie den Dienst. (Wenn der Webverwaltungsdienst in der Liste der Windows-Dienste nicht angezeigt wird, stellen Sie sicher, dass Sie den Verwaltungsdienst installiert haben, als Sie die IIS-Rolle hinzugefügt haben.)

Standardmäßig lauscht der Webverwaltungsdienst an TCP-Port 8172. Erstellen Sie in der Windows-Firewall eine neue Eingangsregel, um TCP-Datenverkehr an Port 8172 zuzulassen. Weitere Informationen finden Sie unter Konfigurieren von Firewallregeln. (Wenn Sie die virtuellen Computer in Azure hosten, können Sie dies direkt im Azure-Portal. Weitere Informationen finden Sie unter Einrichten von Endpunkten auf einem virtuellen Computer.)

Jetzt können Sie das Visual Studio-Projekt von Ihrem Entwicklungscomputer auf dem Server bereitstellen. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und klicken Sie dann auf Veröffentlichen.

Eine ausführlichere Dokumentation zur Webbereitstellung finden Sie unter Inhaltszuordnung der Webbereitstellung für Visual Studio und ASP.NET.

Wenn Sie die Anwendung auf zwei Servern bereitstellen, können Sie jede instance in einem separaten Browserfenster öffnen und sehen, dass sie jeweils SignalR-Nachrichten vom anderen empfangen. (In einer Produktionsumgebung würden sich die beiden Server natürlich hinter einem Lastenausgleich befinden.)

Screenshot der Signal-R-Nachrichten, die in einem Internet Explorer Webbrowser mit dem Bildschirm

Wenn Sie wissen möchten, welche Nachrichten an Redis gesendet werden, können Sie den redis-cli-Client verwenden, der mit Redis installiert wird.

redis-cli -a password
SUBSCRIBE ChatApp

Screenshot des Azure-Benutzerausgabebildschirms, auf dem die Informationen für alle gesendeten Nachrichten und den begleitenden Code angezeigt werden.