共用方式為


可靠的工作階段最佳做法

此主題討論可靠工作階段的最佳做法。

設定 MaxTransferWindowSize

Windows Communication Foundation (WCF) 中的可靠工作階段使用傳輸窗口將訊息保留在用戶端與服務上。 可設定的屬性 MaxTransferWindowSize 代表傳輸窗口可保留的訊息數量。

在傳送端,此屬性表示傳輸窗口在等候認可期間能夠保留的訊息數;在接收端,此屬性則表示服務要緩衝處理的訊息數。

選擇正確的大小會影響網路效率,以及服務的最佳容量。 下列各節將詳細說明選擇此屬性值要考量的事項,以及該值對各方面的影響。

預設傳輸窗口大小為 8 則訊息。

有效率地使用網路

在此內容中,「網路」一詞對應至用戶端 (傳送端) 與服務 (接收端) 之間用作通訊基礎的所有事項。 這些事項包括傳輸連線與任何介於連線之間的中繼或橋接器,包括 SOAP 路由器或 HTTP Proxy/防火牆等。

有效率地使用網路可確保充分運用網路功能。 每秒透過網路傳送的資料量 (「資料速率」) 以及從傳送端將資料傳送至接收端所需的時間 (「延遲時間」),兩者都會影響網路的使用效率。

在傳送端,屬性 MaxTransferWindowSize 代表其傳輸窗口在等候認可期間能夠保留的訊息數量。 因此,若網路延遲時間很長,為了確保傳送端能夠提供回應且有效地運用網路,您應該增加傳輸窗口的大小。

例如,即使傳送端保持不變的資料速率,若在傳送端與接收端之間存在好幾個中繼,或資料必須通過耗損率高的中繼或網路,則延遲時間就會拉長。 因此,傳送端在接受新的訊息並在網路上傳輸之前,必須等候其傳輸窗口中的訊息得到認可。 若緩衝區愈小而延遲時間長,則網路使用效率就會降低。 另一方面,太大的傳輸窗口會影響服務效率,因為服務可能必須跟上用戶端傳送的高資料傳送速率。

讓服務效能發揮到極致

不只網路需要有效運用,最好也能讓服務發揮最大的效用。 接收端上的傳輸窗口大小屬性代表接收端可以緩衝處理的訊息數量。 這項訊息緩衝處理作業不只能協助控制網路流量,同時能讓服務效能發揮到極致。 例如,若緩衝區為一則訊息,而訊息抵達速度快過服務處理訊息的速度時,網路可能會捨棄訊息,導致效能遭到浪費或是未能充分運用。

使用緩衝區可以增加服務的可用性,因為緩衝區能夠一面接收及緩衝處理訊息,一面處理先前接收的訊息。

建議您同時在接收端與傳送端使用相同的 MaxTransferWindowSize

啟用流量控制

「流量控制」機制能夠確保傳送端與接收端彼此跟上對方的速度,亦即,訊息產生之後,對方就能立刻取用及動作。 用戶端與服務上的傳輸窗口大小可確保傳送端與接收端都有同樣合理的同步處理時間。

當您在 WCF 用戶端與 WCF 服務之間使用可靠工作階段時,強烈建議您將屬性 FlowControlEnabled 設定為 true

設定 MaxPendingChannels

在撰寫啟用來自不同用戶端之可靠工作階段通訊的服務時,可能會有許多用戶端同時建立對服務的可靠工作階段連線。 在這些情況中,服務將視 MaxPendingChannels 屬性做出回應。

當傳送端對接收端建立可靠工作階段通道時,彼此之間的信號交換會建立可靠工作階段。 一旦建立了可靠工作階段,就會將通道放到擱置的通道佇列中,等候服務來接受它。 MaxPendingChannels 屬性代表可處於此狀態的通道數量。

服務有可能無法接受更多的通道。 若佇列已滿,就會拒絕建立可靠工作階段的嘗試,此時用戶端就必須重試。

佇列中擱置的通道也可能會繼續停留在佇列一段時間。 這時候,可靠工作階段中可能會發生無活動逾時,導致通道轉換為錯誤狀態。

在寫入可同時服務多個用戶端的服務時,您應該針對個人需求來設定適當的值。 若將 MaxPendingChannels 屬性值設定得太高,將會影響您的工作集。

MaxPendingChannels 的預設值為四個通道。

可靠工作階段與裝載

當 Web 正在裝載使用可靠工作階段的服務時,您應該隨時注意下列重要事項:

  • 可靠工作階段是可設定狀態的,而且可透過 AppDomain 來維護狀態。 意思就是,所有屬於可靠工作階段一部分的訊息,都必須透過同一個 AppDomain 來處理。 Web 伺服器陣列與 Web 處理序區 (其中伺服器陣列或處理序區的大小大於一個節點) 無法保證符合此條件約束。

  • 使用雙重 HTTP 通道的可靠工作階段 (例如,使用 WsDualHttpBinding) 可以在每個用戶端上要求兩個預設 HTTP 連線。 意思就是,雙工可靠工作階段最多可在每個方向要求兩個連線,因為並行的應用程式與通訊協定訊息在任何特定時間都可以雙向進行傳輸。 這表示在特定條件下,只要服務的訊息交換模式許可,即可將使用雙重 HTTP 與可靠工作階段的 Web 裝載服務鎖死。 若要增加每個用戶端上可允許的 HTTP 連線數量,請將下列項目新增至相關的組態檔中 (例如,有問題的服務 web.config):

    <configuration>
      <system.net>
        <connectionManagement>
          <add name="*" maxconnection="4" />
        </connectionManagement>
      </system.net>
    </configuration>
    

    maxconnection 屬性值是所需的連線數目。 在此情況中,最小值應為四個連線。