Lastenausgleich
Eine Möglichkeit zur Steigerung der Kapazität von WCF-Anwendungen (Windows Communication Foundation) besteht darin, sie hochzuskalieren, indem sie in einer Serverfarm mit Lastenausgleich bereitgestellt werden. WCF-Anwendungen können mit Standardverfahren zum Lastenausgleich entsprechend ausgeglichen werden. Dazu gehören Softwarelastenausgleiche wie Windows NLB sowie hardwarebasierte Anwendungen zum Lastenausgleich.
In den folgenden Abschnitten werden Überlegungen für den Lastenausgleich von WCF-Anwendungen erläutert, die mit verschiedenen vom System bereitgestellten Bindungen erstellt wurden.
Lastenausgleich mit der Basic-HTTP-Bindung
Im Hinblick auf Lastenausgleich unterscheiden sich WCF-Anwendungen, die mithilfe der BasicHttpBinding kommunizieren, nicht von anderen gängigen Arten des HTTP-Netzwerkdatenverkehrs, z B. statischer HTML-Inhalte, ASP.NET-Seiten oder ASMX-Webdienste. WCF-Kanäle, die diese Bindung verwenden, sind grundsätzlich zustandslos und beenden ihre Verbindungen, wenn der Kanal geschlossen wird. Daher funktioniert die BasicHttpBinding gut mit vorhandenen HTTP-Lastenausgleichstechniken.
Standardmäßig sendet die BasicHttpBinding einen HTTP-Verbindungsheader in Nachrichten mit einem Keep-Alive
-Wert, der Clients ermöglicht, permanente Verbindungen zu den Diensten herzustellen, die sie unterstützen. Diese Konfiguration bietet einen höheren Durchsatz, da zuvor hergestellte Verbindungen erneut verwendet werden können, um nachfolgende Nachrichten an denselben Server zu senden. Die Wiederverwendung der Verbindung kann jedoch dazu führen, dass Clients eng mit einem bestimmten Server innerhalb der Serverfarm mit Lastenausgleich verbunden werden, was die Effektivität des Roundrobin-Lastenausgleichs reduziert. Wenn dieses Verhalten unerwünscht ist, kann HTTP Keep-Alive
auf dem Server deaktiviert werden, indem die KeepAliveEnabled-Eigenschaft mit einer CustomBinding oder einer benutzerdefinierten Binding verwendet wird. Im folgenden Beispiel wird gezeigt, wie dieser Vorgang unter Verwendung der Konfiguration ausgeführt wird.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/servicemodelsamples/service"/>
</baseAddresses>
</host>
<!-- configure http endpoint, use base address provided by host
And the customBinding -->
<endpoint address=""
binding="customBinding"
bindingConfiguration="HttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
<bindings>
<customBinding>
<!-- Configure a CustomBinding that disables keepAliveEnabled-->
<binding name="HttpBinding" keepAliveEnabled="False"/>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Wenn Sie die in .NET Framework 4 eingeführte vereinfachte Konfiguration verwenden, kann das gleiche Verhalten mit der folgenden vereinfachten Konfiguration erreicht werden.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="customBinding" />
</protocolMapping>
<bindings>
<customBinding>
<!-- Configure a CustomBinding that disables keepAliveEnabled-->
<binding keepAliveEnabled="False"/>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Weitere Informationen über Standardendpunkte, Bindungen und Verhalten finden Sie unter Simplified Configuration (Vereinfachte Konfiguration) und Simplified Configuration for WCF Services (Vereinfachte Konfiguration für WCF-Dienste).
Lastenausgleich mit der WSHttp-Bindung und der WSDualHttp-Bindung
Sowohl die WSHttpBinding als auch die WSDualHttpBinding können mit HTTP-Lastenausgleichstechniken ausgeglichen werden, vorausgesetzt, an der Standardbindungskonfiguration werden einige Änderungen vorgenommen.
Deaktivieren Sie die Einrichtung des Sicherheitskontexts, oder verwenden Sie zustandsbehaftete Sicherheitssitzungen. Die Einrichtung des Sicherheitskontexts kann durch Festlegen der EstablishSecurityContext-Eigenschaft der WSHttpBinding auf
false
deaktiviert werden. Wenn Sie WSDualHttpBinding verwenden oder Sicherheitssitzungen erforderlich sind, können Sie auch zustandsbehaftete Sicherheitssitzungen nutzen, wie unter Sichere Sitzungen beschrieben. Zustandsbehaftete Sicherheitssitzungen ermöglichen es dem Dienst, zustandslos zu bleiben, da der gesamte Zustand für die Sicherheitssitzung mit jeder Anforderung als Teil des Schutzsicherheitstokens übertragen wird. Um eine zustandsbehaftete Sicherheitssitzung zu aktivieren, müssen Sie eine CustomBinding oder eine benutzerdefinierte Binding verwenden, da die erforderlichen Konfigurationseinstellungen nicht für die vom System bereitgestellten WSHttpBinding und WSDualHttpBindingverfügbar gemacht werden.Wenn Sie die Einrichtung des Sicherheitskontexts deaktivieren, müssen Sie auch die Aushandlung von Dienstanmeldeinformationen deaktivieren. Um sie zu deaktivieren, legen Sie die NegotiateServiceCredential-Eigenschaft auf der WSHttpBinding auf
false
fest. Um die Aushandlung von Dienstanmeldeinformationen zu deaktivieren, müssen Sie möglicherweise explizit die Endpunktidentität auf dem Client angeben.Verwenden Sie keine zuverlässigen Sitzungen. Dieses Feature ist standardmäßig deaktiviert.
Lastenausgleich der Net.TCP-Bindung
Für die NetTcpBinding kann mit Lastenausgleichstechniken der IP-Ebene ein Lastausgleich vorgenommen werden. Die NetTcpBinding legt jedoch TCP-Verbindungen standardmäßig zusammen, um die Verbindungswartezeit zu reduzieren. Dies ist eine Optimierung, die den grundlegenden Mechanismus des Lastenausgleichs behindert. Der primäre Konfigurationswert zur Optimierung der NetTcpBinding ist der Leasetimeout, der zu den Verbindungspooleinstellungen gehört. Verbindungspooling bewirkt, dass Clientverbindungen bestimmten Servern innerhalb der Farm zugeordnet werden. Mit steigender Lebensdauer dieser Verbindung (ein Faktor, der von der Leasetimeout-Einstellung gesteuert wird) wird die Lastenverteilung über die verschiedenen Server auf der Farm zunehmend unausgeglichen. Demzufolge steigt die durchschnittliche Aufrufzeit. Erwägen Sie daher bei der Verwendung der NetTcpBinding in Lastenausgleichsszenarien, den von der Bindung verwendeten Leasetimeout-Standardwert zu reduzieren. Ein 30 Sekunden dauernder Leasetimeout ist ein angemessener Ausgangspunkt für Lastenausgleichsszenarien. Der optimale Wert richtet sich jedoch nach der jeweiligen Anwendung. Weitere Informationen zum Kanal-Leasetimeout und anderen Transportkontingenten finden Sie unter Transportkontingente.
Erwägen Sie, für die optimale Leistung in Lastenausgleichsszenarien NetTcpSecurity ( Transport oder TransportWithMessageCredential) zu verwenden.