Istraživanje instanciranja, istodobnosti i regulacije u WCF-u

Kada radite u WCF-u, trebali biste biti svjesni koncepata instanciranja, reguliranja i istodobnosti za izgradnju usluga koje su skalabilne i mogu pružiti bolju propusnost.

Prigušivanje u WCF-u koristi se za ograničavanje protoka usluge tako da potrošnja resursa (memorija, procesor, disk, mreža itd.) U sustavu bude na prihvatljivoj razini, tj. Osigurajte da usluga ne troši resurse izvan prihvatljivih granica. Klasa ServiceThrottlingBehavior može se koristiti za kontrolu izvedbe WCF usluga.

Konkurencija

U WCF-u mogu se pojaviti problemi s istodobnošću kada dvije ili više niti istovremeno pokušavaju pristupiti istom resursu. Imajte na umu da WCF usluga može istovremeno odraditi jedan jedini zahtjev. Istodobnost u WCF-u omogućuje vam upravljanje više aktivnih niti u InstanceContext-u u određenom trenutku. U osnovi, pomaže vam u konfiguriranju broja instanci usluge koje mogu poslužiti više istodobnih zahtjeva. Tri moguće vrste istodobnosti uključuju sljedeće:

Način pojedinačne istodobnosti: U ovom načinu kontekst svake instance može imati najviše jednu nit koja može obraditi zahtjev u određenom trenutku. Kad stigne sljedeći zahtjev, mora pričekati dok se prvi zahtjev ne završi. To također iziskuje potrebu za zaključavanjem sinkronizacije. Sljedeći isječak koda ilustrira kako se može koristiti način pojedinačne istodobnosti.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

usluga javne klase: IServiceContract

{

     javni niz GetMessage ()

     {

          return "Pozdrav svijetu!";

     }

}

Način višestruke istodobnosti: u ovom načinu usluga omogućuje više niti da pristupe operaciji usluge u isto vrijeme. U načinu višestruke istodobnosti rada, svaka WCF usluga ima više niti koje zauzvrat mogu istovremeno obrađivati ​​dolazne zahtjeve.

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

    }

}

Reentrant paralelni način rada: u reentrant načinu rada, iako jedna nit može pristupiti uslužnom objektu, nit i dalje može izaći iz usluge, a zatim nazvati drugu uslugu. Sljedeći isječak koda pokazuje kako možete implementirati ovaj način.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

Svojstvo InstanceContextMode koristi se za određivanje kada će se stvoriti instanca usluge i njezina trajnost. Imajte na umu da su i InstanceContextMode i ConcurrencyMode navedeni pomoću ServiceBehaviorAttribute. Tri dostupne vrijednosti načina kontekstnog načina instancije uključuju: PerCall, PerSession i Single. U načinu PerCall usluga je jednonitna i bez državljanstva. Način PerSession zadani je i koristi se kada želite zadržati informacije o stanju između poziva upućenih od istog potrošača usluge. Pojedinačni način rada koristi se kada vaša usluga treba održavati podatke o stanju svih klijenata, a ubuduće ne biste trebali povećavati uslugu.

Gašenje

Možete koristiti regulaciju za kontrolu i optimizaciju upotrebe resursa, a također i za postizanje uravnoteženja performansi usluge. Regulacija u WCF-u može se konfigurirati deklarativno i programski.

Svojstva maxConcurrentCalls, maxConcurrentInstance, maxConcurrentSessions možete konfigurirati deklarativno koristeći oznaku u datoteci konfiguracije usluge kao što je prikazano u isječku koda u nastavku.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                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.