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