Najlepsze rozwiązania dotyczące sesji niezawodnych

W tym temacie omówiono najlepsze rozwiązania dotyczące niezawodnych sesji.

Ustawianie parametru MaxTransferWindowSize

Niezawodne sesje w programie Windows Communication Foundation (WCF) używają okna transferu do przechowywania komunikatów na kliencie i usłudze. Właściwość konfigurowalna MaxTransferWindowSize wskazuje, ile komunikatów może zawierać okno transferu.

W nadawcy oznacza to, ile komunikatów okno transferu może być wstrzymane podczas oczekiwania na potwierdzenia; w odbiorniku wskazuje liczbę komunikatów do buforowania dla usługi.

Wybór odpowiedniego rozmiaru wpływa na wydajność sieci i optymalną pojemność usługi. W poniższych sekcjach szczegółowo opisano, co należy wziąć pod uwagę podczas wybierania wartości dla tej właściwości i wpływu wartości.

Domyślny rozmiar okna transferu to osiem komunikatów.

Efektywne korzystanie z sieci

W tym kontekście termin sieć odpowiada wszystkim używanym jako podstawa komunikacji między klientem (nadawcą) a usługą (odbiornikiem). Obejmuje to połączenia transportowe i wszelkie pośredniczące lub mostki między, w tym routery PROTOKOŁU SOAP lub serwery proxy HTTP/zapory.

Efektywne wykorzystanie sieci gwarantuje, że pojemność sieci jest w pełni używana. Zarówno ilość danych, które mogą być przesyłane na sekundę przez sieć (szybkość danych), jak i czas potrzebny na transfer danych od nadawcy do odbiornika (opóźnienie) wpływa na sposób efektywnego wykorzystania sieci.

Na nadawcy właściwość MaxTransferWindowSize wskazuje, ile komunikatów może przechowywać okno transferu podczas oczekiwania na potwierdzenia. Jeśli opóźnienie sieci jest wysokie i w celu zapewnienia dynamicznego i efektywnego wykorzystania sieci przez nadawcę, należy zwiększyć rozmiar okna transferu.

Na przykład nawet jeśli nadawca utrzymuje szybkość danych, opóźnienie może być wysokie, jeśli między nadawcą a odbiorcą istnieje kilka pośredników lub dane muszą przechodzić przez pośrednika lub sieć straty. W związku z tym nadawca musi czekać na potwierdzenia wiadomości w oknie transferu przed zaakceptowaniem nowych wiadomości do wysłania w sieci. Mniejszy bufor o dużym opóźnieniu, tym mniejsze wykorzystanie sieci. Z drugiej strony zbyt duży rozmiar okna transferu może mieć wpływ na usługę, ponieważ usługa może wymagać nadrobienia zaległości do wysokiej liczby danych wysyłanych przez klienta.

Uruchamianie usługi do pojemności

Tak samo, jak sieć jest używana wydajnie, najlepiej, aby usługa była uruchamiana w optymalnej pojemności. Właściwość rozmiaru okna transferu w odbiorniku wskazuje, ile komunikatów może buforować odbiorca. Buforowanie komunikatów ułatwia nie tylko sterowanie przepływem sieci, ale także umożliwia uruchomienie usługi do pełnej pojemności. Na przykład jeśli bufor jest jednym komunikatem i komunikaty docierają szybciej niż usługa może je przetworzyć, sieć może porzucić komunikaty i pojemność może zostać zmarnowana lub nie w pełni wykorzystana.

Użycie buforu zwiększa dostępność usługi w miarę jednoczesnego odbierania i buforowania komunikatu podczas przetwarzania wcześniej odebranych komunikatów.

Zalecamy, aby używać tego samego MaxTransferWindowSize zarówno dla nadawcy, jak i odbiorcy.

Włączanie sterowania przepływem

Sterowanie przepływem to mechanizm, który zapewnia, że nadawca i odbiorca nadążają za sobą, czyli komunikaty są używane i działają tak szybko, jak są tworzone. Rozmiar okna transferu na kliencie i usłudze gwarantuje, że nadawca i odbiorca znajdują się w rozsądnym przedziale czasu synchronizacji.

Zdecydowanie zalecamy ustawienie właściwości na true wartość FlowControlEnabled w przypadku korzystania z niezawodnej sesji między klientem programu WCF i usługą WCF.

Ustawianie elementu MaxPendingChannels

Podczas pisania usługi, która umożliwia niezawodną komunikację sesji z różnych klientów, istnieje możliwość ustanowienia niezawodnej sesji dla usługi w tym samym czasie. Odpowiedź usługi w tych sytuacjach zależy od MaxPendingChannels właściwości.

Gdy nadawca tworzy niezawodny kanał sesji dla odbiornika, uzgadnianie między nimi ustanawia niezawodną sesję. Po ustanowieniu niezawodnej sesji kanał jest umieszczany w oczekującej kolejce kanału do akceptacji przez usługę. Właściwość MaxPendingChannels wskazuje, ile kanałów może znajdować się w tym stanie.

Usługa może znajdować się w stanie, w którym nie może zaakceptować większej liczby kanałów. Jeśli kolejka jest pełna, próba ustanowienia niezawodnej sesji zostanie odrzucona, a klient musi ponowić próbę.

Istnieje również możliwość, że oczekujące kanały w kolejce pozostają w kolejce przez dłuższy czas. W międzyczasie może wystąpić przekroczenie limitu czasu braku aktywności w niezawodnej sesji, co powoduje przejście kanału do stanu uszkodzonego.

Podczas pisania usługi, która obsługuje jednocześnie wielu klientów, należy ustawić wartość odpowiednią dla Twoich potrzeb. Ustawienie zbyt dużej wartości właściwości MaxPendingChannels wpływa na zestaw roboczy.

Wartość domyślna parametru MaxPendingChannels to cztery kanały.

Niezawodne sesje i hosting

W przypadku hostowania sieci Web usługi korzystającej z niezawodnych sesji należy pamiętać o następujących ważnych kwestiach:

  • Niezawodne sesje są stanowe, a stan jest utrzymywany w domenie AppDomain. Oznacza to, że wszystkie komunikaty będące częścią niezawodnej sesji muszą być przetwarzane w tej samej domenie aplikacji. Farmy internetowe i ogrody internetowe, w których rozmiar farmy lub ogrodu jest większy niż jeden węzeł, nie może zagwarantować tego ograniczenia.

  • Niezawodne sesje korzystające z dwóch kanałów HTTP (na przykład przy użyciu polecenia WsDualHttpBinding) mogą wymagać więcej niż dwóch połączeń HTTP na klienta. Oznacza to, że dwukierunkowa niezawodna sesja może wymagać maksymalnie dwóch połączeń w każdy sposób, ponieważ współbieżne komunikaty aplikacji i protokołu mogą być przesyłane w dowolnym momencie. W pewnych warunkach w zależności od wzorca wymiany komunikatów usługi oznacza to, że istnieje możliwość zakleszczenia usługi hostowanej w Internecie przy użyciu dwóch sesji HTTP i niezawodnych. Aby zwiększyć liczbę dozwolonych połączeń HTTP na klienta, dodaj następujący kod do odpowiedniego pliku konfiguracji (na przykład web.config danej usługi):

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

    Wartość atrybutu maxconnection to wymagana liczba połączeń. Wartość minimalna w tym przypadku powinna wynosić cztery połączenia.