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.
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.
Installieren Sie Redis, und starten Sie den Redis-Server.
Fügen Sie Ihrer Anwendung die folgenden NuGet-Pakete hinzu:
Erstellen Sie eine SignalR-Anwendung.
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.
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.
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
Ö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.
Schließen Sie auch den Verwaltungsdienst (aufgeführt unter "Verwaltungstools") ein.
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.
Ü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.)
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