Horizontale Skalierung in SignalR mit Azure Service Bus
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 stellen Sie eine SignalR-Anwendung in einer Windows Azure-Webrolle bereit, indem Sie die Service Bus-Backplane verwenden, um Nachrichten an jede Rolle instance zu verteilen. (Sie können die Service Bus-Backplane auch mit Web-Apps in Azure App Service verwenden.)
Voraussetzungen:
- Ein Windows Azure-Konto.
- Das Windows Azure SDK.
- Visual Studio 2012 oder 2013.
Die Service Bus-Backplane ist auch mit Service Bus für Windows Server, Version 1.1, kompatibel. Es ist jedoch nicht mit Version 1.0 von Service Bus für Windows Server kompatibel.
Preise
Die Service Bus-Backplane verwendet Themen zum Senden von Nachrichten. Die neuesten Preisinformationen finden Sie unter Service Bus. Zum Zeitpunkt dieses Schreibens können Sie 1.000.000 Nachrichten pro Monat für weniger als 1 US-Dollar senden. Die Backplane sendet eine Service Bus-Nachricht für jeden Aufruf einer SignalR-Hubmethode. Es gibt auch einige Kontrollmeldungen für Verbindungen, Trennungen, Das Beitreten oder Verlassen von Gruppen usw. In den meisten Anwendungen ist der Großteil des Nachrichtendatenverkehrs Hubmethodenaufrufe.
Übersicht
Bevor wir mit dem ausführlichen Tutorial beginnen, finden Sie hier eine kurze Übersicht über ihre Aufgaben.
Verwenden Sie die Windows-Azure-Portal, um einen neuen Service Bus-Namespace zu erstellen.
Fügen Sie Ihrer Anwendung die folgenden NuGet-Pakete hinzu:
Erstellen Sie eine SignalR-Anwendung.
Fügen Sie startup.cs den folgenden Code hinzu, um die Backplane zu konfigurieren:
public void Configuration(IAppBuilder app) { string connectionString = "Service Bus connection string"; GlobalHost.DependencyResolver.UseServiceBus(connectionString, "YourAppName"); app.MapSignalR(); // ... }
Dieser Code konfiguriert die Backplane mit den Standardwerten für TopicCount und MaxQueueLength. Informationen zum Ändern dieser Werte finden Sie unter SignalR-Leistung: Skalierungsmetriken.
Wählen Sie für jede Anwendung einen anderen Wert für "YourAppName" aus. Verwenden Sie nicht denselben Wert für mehrere Anwendungen.
Erstellen der Azure-Dienste
Erstellen Sie einen Clouddienst, wie unter Erstellen und Bereitstellen eines Clouddiensts beschrieben. Führen Sie die Schritte im Abschnitt "Vorgehensweise: Erstellen eines Clouddiensts mithilfe der Schnellerstellung" aus. Für dieses Tutorial müssen Sie kein Zertifikat hochladen.
Erstellen Sie einen neuen Service Bus-Namespace, wie unter Verwenden von Service Bus-Themen/Abonnements beschrieben. Führen Sie die Schritte im Abschnitt "Erstellen eines Dienstnamespace" aus.
Hinweis
Stellen Sie sicher, dass Sie dieselbe Region für den Clouddienst und den Service Bus-Namespace auswählen.
Erstellen des Visual Studio-Projekts
Starten Sie Visual Studio. Klicken Sie im Menü Datei auf Neues Projekt.
Erweitern Sie im Dialogfeld Neues Projekt den Eintrag Visual C#. Wählen Sie unter Installierte Vorlagendie Option Cloud und dann Windows Azure Cloud Service aus. Behalten Sie die Standardeinstellung .NET Framework 4.5 bei. Nennen Sie die Anwendung ChatService, und klicken Sie auf OK.
Wählen Sie im Dialogfeld Neuer Windows Azure-Clouddienst die Option ASP.NET Webrolle aus. Klicken Sie auf die Nach-rechts-Taste (>), um der Lösung die Rolle hinzuzufügen.
Zeigen Sie mit der Maus auf die neue Rolle, damit das Stiftsymbol sichtbar ist. Klicken Sie auf dieses Symbol, um die Rolle umzubenennen. Nennen Sie die Rolle "SignalRChat", und klicken Sie auf OK.
Wählen Sie im Dialogfeld Neues ASP.NET Projektdie Option MVC aus, und klicken Sie auf OK.
Der Projekt-Assistent erstellt zwei Projekte:
- ChatService: Dieses Projekt ist die Windows Azure-Anwendung. Sie definiert die Azure-Rollen und andere Konfigurationsoptionen.
- SignalRChat: Dieses Projekt ist Ihr ASP.NET MVC 5-Projekt.
Erstellen der SignalR Chat-Anwendung
Führen Sie zum Erstellen der Chatanwendung die Schritte im Tutorial Erste Schritte mit SignalR und MVC 5 aus.
Verwenden Sie NuGet, um die erforderlichen Bibliotheken zu installieren. Wählen Sie im Menü Extras die Option NuGet-Paket-Manager und dann Paket-Manager-Konsole aus. Geben Sie im Fenster Paket-Manager-Konsole die folgenden Befehle ein:
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR.ServiceBus
Verwenden Sie die -ProjectName
Option, um die Pakete im ASP.NET MVC-Projekt anstelle des Windows Azure-Projekts zu installieren.
Konfigurieren der Backplane
Fügen Sie in der Datei Startup.cs Ihrer Anwendung den folgenden Code hinzu:
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
string connectionString = "";
GlobalHost.DependencyResolver.UseServiceBus(connectionString, "Chat");
app.MapSignalR();
}
Jetzt müssen Sie ihre Service Bus-Verbindungszeichenfolge abrufen. Wählen Sie im Azure-Portal den von Ihnen erstellten Service Bus-Namespace aus, und klicken Sie auf das Symbol Zugriffsschlüssel.
Kopieren Sie die Verbindungszeichenfolge in die Zwischenablage, und fügen Sie sie dann in die connectionString-Variable ein.
string connectionString = "Endpoint=sb://xxxx.servicebus.windows.net/;
SharedSecretIssuer=owner;SharedSecretValue=XXXXXXXX";
In Azure bereitstellen
Erweitern Sie in Projektmappen-Explorer den Ordner Rollen im ChatService-Projekt.
Klicken Sie mit der rechten Maustaste auf die Rolle SignalRChat, und wählen Sie Eigenschaften aus. Wählen Sie die Registerkarte Konfiguration aus. Wählen Sie unter Instanzen die Option 2 aus. Sie können die VM-Größe auch auf Extra Small festlegen.
Speichern Sie die Änderungen.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt ChatService. Wählen Sie Veröffentlichen.
Wenn Sie zum ersten Mal in Windows Azure veröffentlichen, müssen Sie Ihre Anmeldeinformationen herunterladen. Klicken Sie im Veröffentlichungs-Assistenten auf "Anmeldeinformationen herunterladen". Dadurch werden Sie aufgefordert, sich beim Windows-Azure-Portal anzumelden und eine Veröffentlichungseinstellungsdatei herunterzuladen.
Klicken Sie auf Importieren , und wählen Sie die datei mit den Veröffentlichungseinstellungen aus, die Sie heruntergeladen haben.
Klicken Sie auf Weiter. Wählen Sie im Dialogfeld Veröffentlichungseinstellungen unter Clouddienst den zuvor erstellten Clouddienst aus.
Klicken Sie auf Veröffentlichen. Es kann einige Minuten dauern, bis die Anwendung bereitgestellt und die VMs gestartet werden.
Wenn Sie nun die Chatanwendung ausführen, kommunizieren die Rolleninstanzen mithilfe eines Service Bus-Themas über Azure Service Bus. Ein Thema ist eine Nachrichtenwarteschlange, die mehrere Abonnenten zulässt.
Die Backplane erstellt automatisch das Thema und die Abonnements. Um die Abonnement- und Nachrichtenaktivität anzuzeigen, öffnen Sie die Azure-Portal, wählen Sie den Service Bus-Namespace aus, und klicken Sie auf "Themen".
Es dauert einige Minuten, bis die Nachrichtenaktivität im Dashboard angezeigt wird.
SignalR verwaltet die Lebensdauer des Themas. Versuchen Sie nicht, Themen manuell zu löschen oder Einstellungen für das Thema zu ändern, solange Ihre Anwendung bereitgestellt wird.
Problembehandlung
System.InvalidOperationException "Der einzige unterstützte IsolationLevel ist 'IsolationLevel.Serializable'."
Dieser Fehler kann auftreten, wenn die Transaktionsebene für einen Vorgang auf etwas anderes als Serializable
festgelegt ist. Stellen Sie sicher, dass keine Vorgänge mit anderen Transaktionsebenen ausgeführt werden.