WCF負載平衡實現(xiàn)方法總結(jié)
WCF框架是一款功能比較強大的開發(fā)工具。對于一個經(jīng)驗豐富的開發(fā)人員來說,對這框架的應(yīng)用應(yīng)該是相當(dāng)熟悉的。提高WCF應(yīng)用程序能力的方法之一是通過把它們部署到負載平衡的服務(wù)器場來擴展它們。#t#
使用標準的WCF負載平衡技術(shù),包括諸如 Windows 網(wǎng)絡(luò)負載平衡這樣的軟件負載平衡器以及基于硬件的負載平衡設(shè)備,可以使 WCF 應(yīng)用程序?qū)崿F(xiàn)負載平衡。
以下各節(jié)討論對使用各種系統(tǒng)提供的綁定生成的 WCF 應(yīng)用程序?qū)崿F(xiàn)負載平衡時的注意事項。
基本 HTTP 綁定的WCF負載平衡
從負載平衡的角度看,使用 BasicHttpBinding 進行通信的 WCF 應(yīng)用程序與其他普通類型的 HTTP 網(wǎng)絡(luò)流量(如靜態(tài) HTML 內(nèi)容、ASP.NET 頁或 ASMX Web 服務(wù))并沒有什么區(qū)別。使用此綁定的 WCF 通道本質(zhì)上是無狀態(tài)的,當(dāng)通道關(guān)閉時,其連接也會終止。因此,BasicHttpBinding 可以很好地與現(xiàn)有的 HTTP 負載平衡技術(shù)一起使用。
默認情況下,BasicHttpBinding 會在消息中發(fā)送一個具有 Keep-Alive 值的連接 HTTP 標頭,該標頭可讓客戶端建立到支持這些客戶端的服務(wù)的持續(xù)連接。這種配置具有高的吞吐量,因為可以重新使用以前建立的連接向同一個服務(wù)器發(fā)送后續(xù)消息。然而,重新使用連接可能導(dǎo)致客戶端與負載平衡場中的特定服務(wù)器密切關(guān)聯(lián),從而降低循環(huán)負載平衡的效率。如果不需要此行為,則可以使用 CustomBinding 或用戶定義的 Binding 在使用 KeepAliveEnabled 屬性的服務(wù)器上禁用 HTTP Keep-Alive。下面的示例演示如何使用配置來執(zhí)行該操作。
- < ?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>
WSHttp 綁定和 WSDualHttp 綁定的WCF負載平衡
如果對默認的綁定配置進行一些修改,則 WSHttpBinding 和 WSDualHttpBinding 都可以使用 HTTP 負載平衡技術(shù)來實現(xiàn)負載平衡。
關(guān)閉安全上下文的建立:這可以通過將 WSHttpBinding 上的 EstablishSecurityContext 屬性設(shè)置為 false 來完成。或者,如果需要安全會話,則可以按照 安全會話 主題中的說明,使用有狀態(tài)安全會話。有狀態(tài)安全會話使服務(wù)保持無狀態(tài),因為安全會話的所有狀態(tài)都隨每個請求作為保護安全令牌的一部分進行傳輸。請注意,若要啟用有狀態(tài)安全會話,必須使用 CustomBinding 或用戶定義的 Binding,因為系統(tǒng)提供的 WSHttpBinding 和 WSDualHttpBinding 上并不會公開必需的配置設(shè)置。
不要使用可靠會話。默認情況下此功能處于關(guān)閉狀態(tài)。
使 Net.TCP 綁定實現(xiàn)WCF負載平衡
可以使用 IP 層負載平衡技術(shù)實現(xiàn) NetTcpBinding 的負載平衡。不過,默認情況下,NetTcpBinding 會匯集 TCP 連接以減少連接延遲。這是一種干擾負載平衡基本機制的優(yōu)化。用于優(yōu)化 NetTcpBinding 的主配置值是租約超時,它是連接池設(shè)置的一部分。連接池導(dǎo)致客戶端連接與場內(nèi)特定的服務(wù)器關(guān)聯(lián)。隨著這些連接的生存期的增加(一個受租約超時設(shè)置控制的因素),場內(nèi)不同服務(wù)器上的負載分布會變得不平衡。結(jié)果使平均調(diào)用時間增加。
因此,在負載平衡方案中使用 NetTcpBinding 時,應(yīng)考慮減少由綁定使用的默認租約超時。雖然租約超時的***值取決于應(yīng)用程序,但 30 秒的租約超時對于負載平衡方案不失為一個合理的始點。有關(guān)通道租約超時和其他傳輸配額的更多信息,請參見傳輸配額。
若要在負載平衡方案中獲得***性能,請考慮使用 NetTcpSecurity(Transport 或 TransportWithMessageCredential)。