Erkundung von Instanzen, Parallelität und Drosselung in WCF

Wenn Sie in WCF arbeiten, sollten Sie die Konzepte der Instanziierung, Drosselung und Parallelität kennen, um Dienste zu erstellen, die skalierbar sind und einen besseren Durchsatz bieten können.

Die Drosselung in WCF wird verwendet, um den Dienstdurchsatz so zu begrenzen, dass der Ressourcenverbrauch (Speicher, Prozessor, Festplatte, Netzwerk usw.) im System auf einem akzeptablen Niveau liegt, dh um sicherzustellen, dass der Dienst keine Ressourcen über akzeptable Grenzen hinaus verbraucht. Mit der ServiceThrottlingBehavior-Klasse kann die Leistung von WCF-Diensten gesteuert werden.

Parallelität

In WCF können Parallelitätsprobleme auftreten, wenn zwei oder mehr Threads gleichzeitig versuchen, auf dieselbe Ressource zuzugreifen. Beachten Sie, dass ein WCF-Dienst jeweils eine einzelne Anforderung verarbeiten kann. Mit der Parallelität in WCF können Sie mehrere aktive Threads in einem InstanceContext zu einem bestimmten Zeitpunkt steuern. Im Wesentlichen hilft es Ihnen, die Anzahl der Dienstinstanzen zu konfigurieren, die mehrere gleichzeitige Anforderungen bedienen können. Die drei möglichen Arten von Parallelitätsmodi umfassen Folgendes:

Einzelner Parallelitätsmodus: In diesem Modus kann jeder Instanzkontext maximal einen Thread haben, der die Anforderung zu einem bestimmten Zeitpunkt verarbeiten kann. Wenn die nächste Anfrage eintrifft, muss sie warten, bis die erste Anfrage abgeschlossen ist. Dies erfordert auch Synchronisationssperren. Das folgende Codeausschnitt zeigt, wie der Einzel-Parallelitätsmodus verwendet werden kann.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

public class Service: IServiceContract

{

     öffentlicher String GetMessage ()

     {

          return "Hallo Welt!";

     }}

}}

Mehrfacher Parallelitätsmodus: In diesem Modus ermöglicht der Dienst mehreren Threads den gleichzeitigen Zugriff auf einen Dienstvorgang. Im Betriebsmodus mit mehreren Parallelitäten verfügt jeder WCF-Dienst über mehrere Threads, die wiederum die eingehenden Anforderungen gleichzeitig verarbeiten können.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

public class Service : IServiceContract

{

    readonly object lockObj = new object();

    public string GetMessage()

    {

        string message = string.Empty;

        lock (lockObj)

        {

             message = "Hello World!";

        }

        return message;

    }

}

Wiedereintritts-Parallelitätsmodus: Im Wiedereintrittsmodus kann ein einzelner Thread zwar auf das Dienstobjekt zugreifen, der Thread kann jedoch den Dienst beenden und dann einen anderen Dienst aufrufen. Das folgende Codefragment zeigt, wie Sie diesen Modus implementieren können.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

Die InstanceContextMode-Eigenschaft wird verwendet, um anzugeben, wann eine Instanz des Dienstes erstellt wird und wie lange sie gültig ist. Beachten Sie, dass sowohl InstanceContextMode als auch ConcurrencyMode mithilfe des ServiceBehaviorAttribute angegeben werden. Die drei verfügbaren Werte für den Kontextmodus der Instanz umfassen: PerCall, PerSession und Single. Im PerCall-Modus ist der Dienst Single-Threaded und zustandslos. Der PerSession-Modus ist die Standardeinstellung und wird verwendet, wenn Sie Statusinformationen zwischen Anrufen verwalten möchten, die von demselben Dienstkonsumenten stammen. Der Einzelmodus wird verwendet, wenn Ihr Dienst Statusinformationen zwischen Clients verwalten muss und Sie Ihren Dienst in Zukunft nicht mehr skalieren müssen.

Drosselung

Sie können die Drosselung nutzen, um die Ressourcennutzung zu steuern und zu optimieren und um eine Möglichkeit zu finden, die Serviceleistung auszugleichen. Die Drosselung in WCF kann sowohl deklarativ als auch programmgesteuert konfiguriert werden.

Sie können die Eigenschaften maxConcurrentCalls, maxConcurrentInstances und maxConcurrentSessions deklarativ mithilfe des Tags in der Dienstkonfigurationsdatei konfigurieren, wie im folgenden Codeausschnitt gezeigt.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                maxConcurrentInstances

                                maxConcurrentSessions/>

       

     

   

The maxConcurrentCalls property is used to limit the total number of calls across all the service instances. The default value is 16 per processor. The maxConcurrentInstances property is used to specify the total number of service instances that can be allocated at a particular point of time. The default value of this property is Int32.MaxValue. The maxConcurrentSessions property is used to specify the total number of concurrent active sessions that is permissible for a service at a given point of time. The default value is 100 per processor.

Now that we know how to configure service throttling in WCF declaratively, let’s explore how we can configure service throttling in WCF programmatically. To configure service throttling in WCF programmatically, you would need to take advantage of the ServiceThrottlingBehavior class. The following code listing shows how you can take advantage of the ServiceThrottlingBehavior class to configure the concurrent calls, session and instance properties.

ServiceHost serviceHost = new ServiceHost(typeof(Service));

           ServiceThrottlingBehavior throttleBehavior = serviceHost.Description.Behaviors.Find();

            if (throttleBehavior == null)

            {

                throttleBehavior = new ServiceThrottlingBehavior();

                throttleBehavior.MaxConcurrentCalls = 1000;

                throttleBehavior.MaxConcurrentSessions = 250;

                throttleBehavior.MaxConcurrentInstances = 500;

              serviceHost.Description.Behaviors.Add(throttleBehavior);

            }

In the above code snippet, an instance of ServiceThrottlingBehavior is created and its properties set to the appropriate values. Next, this instance is added to the Behaviors collection of the service host instance.