[轉自MSDN]可靠會話(Reliable Session)的最佳實踐
一、設置 MaxTransferWindowSize
Windows Communication Foundation (WCF) 中的可靠會話使用傳輸窗口保存客戶端和服務上的消息。可配置屬性 MaxTransferWindowSize 指示傳輸窗口可以保存多少條消息。
在發送方,這指示在等待確認消息時傳輸窗口可以保存多少條消息,在接收方,則指示為服務緩衝多少條消息。
選擇合適的大小可影響使用網絡的效率以及運行服務的最佳容量。以下各節將詳細介紹選擇此屬性的值時要考慮的事宜以及值的影響。
默認傳輸窗口大小是 8 條消息。
有效使用網絡
此處的“網絡”一詞對應於在客戶端(發送方)和服務(接收方)之間用作通信基礎的任何事物。這包括傳輸連接以及中間的任何中介或者網橋,包括 SOAP 路由器或 HTTP 代理/防火牆。
有效使用網絡可確保充分利用網絡容量。可通過網絡每秒傳輸的數據量(稱為“數據速率”)以及從發送方到接收方傳輸數據所用的時間(稱為“延遲”)都會影響利用網絡的有效性。
在發送方,屬性 MaxTransferWindowSize 指示在等待確認消息時,其傳輸窗口可以保存多少條消息。因此,如果網絡延遲時間很長,為確保及時響應發送者和網絡有效利用,應增加傳輸窗口大小。
例如,即使發送方滿足數據速率,如果發送方和接收方之間存在多個中介或者中介或網絡存在損失,則延遲時間會很長。因此,在發送方接受要在網絡上發送的新消息之前,必須在其傳輸窗口中等待消息的確認信息。具有高延遲的緩衝區越小,網絡利用率就越低。另一方麵,傳輸窗口大小過高可能會影響服務,原因是服務可能需要滿足客戶端的高發送速率。
滿負荷運行服務
為最大程度地有效使用網絡,理想情況是服務也按最佳容量運行。接收方上的傳輸窗口大小屬性指示接收方可以緩衝多少條消息。此消息緩衝不僅幫助網絡流控製,而且還可讓服務滿負荷運行。例如,如果緩衝區是 1,而且消息到達的速度超過了服務可以處理的速度,則網絡可能會丟棄一些消息,並可能浪費或閑置網絡容量。
使用緩衝區可提高服務的可用性,因為服務可以在處理以前接收到的消息的同時並發接收和緩衝消息。
建議您在發送方和接收方使用相同的 MaxTransferWindowSize。
啟用流控製
流控製是確保發送方和接收方互相保持步調一致的機製,也就是說,使用和處理消息的速度與產生消息的速度一樣快。客戶端和服務上的傳輸窗口大小可確保發送方和接收方在一個合理的同步窗口中。
當在 WCF 客戶端和 WCF 服務之間使用可靠會話時,強烈建議將 FlowControlEnabled 屬性設置 true。
二、設置MaxPendingChannels
當編寫一個允許從不同的客戶端啟用可靠會話通信的服務時,可能會有許多客戶端同時建立與該服務的可靠會話。在這些情況下,服務的響應取決於 MaxPendingChannels 屬性。
當發送方創建到接收方的可靠會話通道時,發送方和接收方之間的握手將建立可靠會話。建立可靠會話之後,該通道會放入到掛起的通道隊列中以供服務接受。此 MaxPendingChannels 屬性指示有多少個通道可以處於此狀態。
服務有可能會處於一種無法接收更多通道的狀態。如果隊列已滿,則會拒絕建立可靠會話的嚐試,客戶端必須重試。
隊列中掛起的通道也可能會在隊列中保持很長時間。此外,可能會出現可靠會話的非活動超時,從而導致通道轉換到錯誤狀態。
因此,在編寫同時服務於多個客戶端的服務時,應設置一個適合於您的需要的值。為 MaxPendingChannels 屬性設置過高的值會影響工作集。
MaxPendingChannels 的默認值為 4。
可靠會話和宿主
在為使用可靠會話服務提供 Web 宿主時,應該記住下麵的重要注意事項:
- 可靠會話是有狀態的,而狀態在 AppDomain 中進行維護。這意味著,屬於可靠會話的一部分的所有消息必須在同一個 AppDomain 中進行處理。其大小超過 1 的網絡場和網絡園無法保證滿足此約束。
- 使用雙工 HTTP 通道(例如使用 WsDualHttpBinding)的可靠會話會要求多於默認的每個客戶端 2 個 HTTP 連接的連接數。這意味著,雙工可靠會話會在每個方向上要求 2 個連接,因為並發應用程序和協議消息可能會在任意給定時間在每個方向上進行傳輸。這意味著,在某些特定的條件下,根據消息交換服務模式的不同,使用雙工 HTTP 和可靠會話的 Web 承載服務可能會出現死鎖。若要增加每個客戶端允許的 HTTP 連接數,請將下麵的代碼添加到相關配置文件中(例如,相關服務的 web.config):
1: <configuration>
2: <system.net>
3: <connectionManagement>
4: <add name = "*" maxconnection = "XX" />
5: </connectionManagement>
6: </system.net>
7: </configuration>
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-27 14:34:31