Проучване на екземпляри, паралелност и регулиране в WCF

Когато работите в WCF, трябва да сте наясно с концепциите за инсталиране, регулиране и паралелност за изграждане на услуги, които са мащабируеми и могат да осигурят по-добра производителност.

Дроселирането в WCF се използва за ограничаване на пропускателната способност на услугата, така че консумацията на ресурси (памет, процесор, диск, мрежа и т.н.) в системата да е на приемливо ниво, т.е. да се гарантира, че услугата не консумира ресурси над допустимите граници. Класът ServiceThrottlingBehavior може да се използва за контрол на производителността на WCF услугите.

Съвпадение

В WCF могат да възникнат проблеми с паралелността, когато две или повече нишки се опитват да получат достъп до един и същи ресурс едновременно. Имайте предвид, че услугата WCF може да обработва по една заявка наведнъж. Паралелността в WCF ви позволява да контролирате множество активни нишки в InstanceContext в определен момент от времето. По същество това ви помага да конфигурирате броя екземпляри на услуги, които могат да обслужват множество едновременни заявки. Трите възможни типа паралелни режими включват следното:

Режим на единична паралелност: В този режим контекстът на всеки екземпляр може да има максимум една нишка, която може да обработва заявката в определен момент от времето. Когато пристигне следващата заявка, тя трябва да изчака, докато първата заявка бъде завършена. Това води и до необходимост от синхронизационни ключалки. Следният кодов фрагмент илюстрира как може да се използва режим на единична паралелност.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

услуга от публичен клас: IServiceContract

{

     публичен низ GetMessage ()

     {

          връщане „Здравей Свят!“;

     }

}

Режим на множество паралелности: В този режим услугата позволява на множество нишки да имат достъп до операция на услуга в един и същ момент от времето. В режима на работа с множество паралелности, всяка услуга на WCF има множество нишки, които от своя страна могат да обработват едновременно входящите заявки.

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

    }

}

Режим на повторно влизане : в режим на повторно влизане, въпреки че една нишка може да има достъп до обекта на услугата, нишката все още може да излезе от услугата и след това да извика друга услуга. Следният кодов фрагмент показва как можете да внедрите този режим.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

Свойството InstanceContextMode се използва за указване кога ще бъде създаден екземпляр на услугата и нейната трайност. Обърнете внимание, че както InstanceContextMode, така и ConcurrencyMode са посочени с помощта на ServiceBehaviorAttribute. Трите налични стойности на контекстния режим на екземпляр включват: PerCall, PerSession и Single. В режим PerCall услугата е с една нишка и е без гражданство. Режимът PerSession е по подразбиране и се използва, когато искате да поддържате информация за състоянието между обажданията, получени от същия потребител на услугата. Единичният режим се използва, когато вашата услуга трябва да поддържа информация за състоянието на клиентите и в бъдеще няма да е необходимо да разширявате услугата си.

Дроселиране

Можете да използвате дроселирането, за да контролирате и оптимизирате използването на ресурсите, а също и да постигнете начин за балансиране на производителността на услугата. Дроселирането в WCF може да бъде конфигурирано декларативно, както и програмно.

Можете да конфигурирате свойствата maxConcurrentCalls, maxConcurrentInsests, maxConcurrentSessions декларативно, като използвате маркера в конфигурационния файл на услугата, както е показано в кодовия фрагмент по-долу.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                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.