Explorer l'instanciation, la concurrence et la limitation dans WCF

Lorsque vous travaillez dans WCF, vous devez connaître les concepts d'instanciation, de limitation et de concurrence pour créer des services évolutifs et offrant un meilleur débit.

La limitation dans WCF est utilisée pour limiter le débit du service afin que la consommation de ressources (mémoire, processeur, disque, réseau, etc.) dans le système soit à un niveau acceptable, c'est-à-dire que le service ne consomme pas de ressources au-delà des limites acceptables. La classe ServiceThrottlingBehavior peut être utilisée pour contrôler les performances des services WCF.

Concurrence

Dans WCF, des problèmes de concurrence peuvent survenir lorsque deux ou plusieurs threads tentent d'accéder à la même ressource en même temps. Notez qu'un service WCF peut gérer une seule demande à la fois. La concurrence dans WCF vous permet de contrôler plusieurs threads actifs dans un InstanceContext à un moment donné. En substance, il vous aide à configurer le nombre d'instances de service qui peuvent servir plusieurs demandes simultanées. Les trois types de modes de concurrence possibles sont les suivants:

Mode de concurrence unique: dans ce mode, chaque contexte d'instance peut avoir un maximum d'un thread qui peut traiter la demande à un moment donné. Lorsque la prochaine demande arrive, elle doit attendre que la première demande soit terminée. Cela entraîne également le besoin de verrous de synchronisation. L'extrait de code suivant illustre comment le mode de concurrence unique peut être utilisé.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

Service de classe publique: IServiceContract

{

     chaîne publique GetMessage ()

     {

          retourne "Hello World!";

     }

}

Mode simultanéité multiple: dans ce mode, le service permet à plusieurs threads d'accéder à une opération de service au même moment. Dans le mode de fonctionnement à accès simultané multiple, chaque service WCF a plusieurs threads qui à leur tour peuvent traiter les demandes entrantes simultanément.

[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;

    }

}

Mode de concurrence réentrante: en mode de fonctionnement réentrant, bien qu'un seul thread puisse accéder à l'objet de service, le thread peut toujours quitter le service, puis appeler un autre service. L'extrait de code suivant montre comment vous pouvez implémenter ce mode.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

La propriété InstanceContextMode est utilisée pour spécifier quand une instance du service sera créée et sa durabilité. Notez que InstanceContextMode et ConcurrencyMode sont spécifiés à l'aide de ServiceBehaviorAttribute. Les trois valeurs de mode contextuel d'instance disponibles incluent: PerCall, PerSession et Single. En mode PerCall, le service est à thread unique et sans état. Le mode PerSession est le mode par défaut et est utilisé lorsque vous souhaitez conserver les informations d'état entre les appels provenant du même consommateur de services. Le mode unique est utilisé lorsque votre service a besoin de conserver des informations d'état sur les clients et que vous n'avez pas besoin de faire évoluer votre service à l'avenir.

Étranglement

Vous pouvez tirer parti de la limitation pour contrôler et optimiser l'utilisation des ressources et également pour trouver un moyen d'équilibrer les performances du service. La limitation dans WCF peut être configurée de manière déclarative et par programme.

Vous pouvez configurer les propriétés maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions de manière déclarative à l'aide de la balise dans le fichier de configuration du service, comme indiqué dans l'extrait de code ci-dessous.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                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.