Exploración de instancias, simultaneidad y limitación en WCF

Cuando trabaje en WCF, debe conocer los conceptos de creación de instancias, limitación y simultaneidad para crear servicios que sean escalables y puedan proporcionar un mejor rendimiento.

La limitación en WCF se usa para limitar el rendimiento del servicio de modo que el consumo de recursos (memoria, procesador, disco, red, etc.) en el sistema esté en un nivel aceptable, es decir, garantizar que el servicio no consuma recursos más allá de los límites aceptables. La clase ServiceThrottlingBehavior se puede usar para controlar el rendimiento de los servicios WCF.

Concurrencia

En WCF, pueden surgir problemas de simultaneidad cuando dos o más subprocesos intentan acceder al mismo recurso al mismo tiempo. Tenga en cuenta que un servicio WCF puede manejar una sola solicitud a la vez. La simultaneidad en WCF le permite controlar varios subprocesos activos en un InstanceContext en un momento determinado. En esencia, le ayuda a configurar la cantidad de instancias de servicio que pueden atender múltiples solicitudes simultáneas. Los tres tipos posibles de modos de simultaneidad incluyen los siguientes:

Modo de concurrencia única: en este modo, cada contexto de instancia puede tener un máximo de un hilo que puede procesar la solicitud en un momento determinado. Cuando llega la siguiente solicitud, debe esperar hasta que se complete la primera solicitud. Esto también incurre en la necesidad de bloqueos de sincronización. El siguiente fragmento de código ilustra cómo se puede utilizar el modo de simultaneidad única.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

Servicio de clase pública: IServiceContract

{

     cadena pública GetMessage ()

     {

          return "¡Hola mundo!";

     }

}

Modo de concurrencia múltiple: en este modo, el servicio permite que varios subprocesos accedan a una operación de servicio en el mismo momento. En el modo de operación de concurrencia múltiple, cada servicio WCF tiene varios subprocesos que, a su vez, pueden procesar las solicitudes entrantes al mismo tiempo.

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

    }

}

Modo de concurrencia reentrante : en el modo de operación reentrante, aunque un solo subproceso puede acceder al objeto de servicio, el subproceso aún puede salir del servicio y luego llamar a otro servicio. El siguiente fragmento de código muestra cómo puede implementar este modo.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

La propiedad InstanceContextMode se usa para especificar cuándo se creará una instancia del servicio y su durabilidad. Tenga en cuenta que tanto InstanceContextMode como ConcurrencyMode se especifican mediante ServiceBehaviorAttribute. Los tres valores de modo de contexto de instancia disponibles incluyen: PerCall, PerSession y Single. En el modo PerCall, el servicio es de un solo subproceso y no tiene estado. El modo PerSession es el predeterminado y se utiliza cuando desea mantener la información de estado entre llamadas originadas por el mismo consumidor de servicios. El modo Único se usa cuando su servicio necesita mantener la información de estado entre los clientes y no necesitaría escalar su servicio en el futuro.

Estrangulamiento

Puede aprovechar la limitación para controlar y optimizar el uso de recursos y también para lograr una forma de equilibrar el rendimiento del servicio. La limitación en WCF se puede configurar de forma declarativa y programática.

Puede configurar las propiedades maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions declarativamente usando la etiqueta en el archivo de configuración del servicio como se muestra en el fragmento de código a continuación.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                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.