Programmēšana

Instancēšanas, vienlaicīguma un droseles izpēte WCF

Strādājot WCF, jums jāzina instancēšanas, droselēšanas un vienlaicīguma jēdzieni, lai izveidotu mērogojamus pakalpojumus, kas var nodrošināt labāku caurlaidspēju.

Droseļošana WCF tiek izmantota, lai ierobežotu pakalpojumu caurlaidi, lai resursu patēriņš (atmiņa, procesors, disks, tīkls utt.) Sistēmā būtu pieņemamā līmenī, t.i., nodrošinātu, ka pakalpojums neizlieto resursus, kas pārsniedz pieņemamās robežas. ServiceThrottlingBehavior klasi var izmantot, lai kontrolētu WCF pakalpojumu sniegumu.

Vienlaicīgums

WCF gadījumā vienlaikus var rasties problēmas, kad divi vai vairāki pavedieni mēģina vienlaikus piekļūt vienam un tam pašam resursam. Ņemiet vērā, ka WCF pakalpojums vienlaikus var apstrādāt vienu pieprasījumu. Vienlaicīgums WCF ļauj noteiktā laika posmā kontrolēt vairākus aktīvus pavedienus Instancekontekstā. Būtībā tas palīdz jums konfigurēt tādu pakalpojumu gadījumu skaitu, kuri var apkalpot vairākus vienlaicīgus pieprasījumus. Trīs iespējamie vienlaicīguma režīmu veidi ir šādi:

Viena vienlaicīguma režīms: Šajā režīmā katrā instances kontekstā var būt ne vairāk kā viens pavediens, kas var apstrādāt pieprasījumu noteiktā laika posmā. Kad pienāk nākamais pieprasījums, tam jāgaida, līdz pirmais pieprasījums ir izpildīts. Tas arī prasa sinhronizācijas slēdzenes. Šis koda fragments parāda, kā var izmantot vienlaicīgas izmantošanas režīmu.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

publiskās klases pakalpojums: IServiceContract

{

publiskā virkne GetMessage ()

     {

atgriezties "Sveika pasaule!";

     }

}

Vairāku vienlaicīguma režīms: Šajā režīmā pakalpojums ļauj vairākiem pavedieniem piekļūt pakalpojuma operācijai tajā pašā laika posmā. Vairāku vienlaicīguma darbības režīmā katram WCF pakalpojumam ir vairākas pavedieni, kas savukārt var vienlaikus apstrādāt ienākošos pieprasījumus.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

publiskās klases pakalpojums: IServiceContract

{

tikai lasāms objekts lockObj = jauns objekts ();

publiskā virkne GetMessage ()

    {

virknes ziņojums = virkne. Tukšs;

slēdzene (lockObj)

        {

message = "Sveika pasaule!";

        }

atgriešanās ziņojums;

    }

}

Reentranta vienlaicīguma režīms: Atkārtotā darbības režīmā, lai gan viena pavediens var piekļūt pakalpojuma objektam, pavediens tomēr var iziet no pakalpojuma un pēc tam izsaukt citu pakalpojumu. Šis koda fragments parāda, kā jūs varat ieviest šo režīmu.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

publiskās klases pakalpojums: IServiceContract

{

publiskā virkne GetMessage ()

     {

atgriezties "Sveika pasaule!";

     }

}

Rekvizītu instanceContextMode izmanto, lai norādītu, kad tiks izveidots pakalpojuma eksemplārs un tā ilgums. Ņemiet vērā, ka gan instanceContextMode, gan ConcurrencyMode tiek norādītas, izmantojot ServiceBehaviorAttribute. Trīs pieejamās instances konteksta režīma vērtības ietver: PerCall, PerSession un Single. PerCall režīmā pakalpojums ir ar vienu pavedienu un ir bezvalstnieks. PerSession režīms ir noklusējums un tiek izmantots, ja vēlaties saglabāt stāvokļa informāciju starp zvaniem, kas veikti no viena un tā paša pakalpojuma patērētāja. Vienotais režīms tiek izmantots, ja jūsu dienestam ir jāuztur valsts informācija par klientiem, un jums nākotnē nevajadzēs paplašināt savu pakalpojumu.

Droseļošana

Varat izmantot ierobežojumus, lai kontrolētu un optimizētu resursu izmantošanu, kā arī panāktu pakalpojumu līdzsvarošanas veidu. Droseļvārstu WCF var konfigurēt gan deklaratīvi, gan programmiski.

Izmantojot deklarāciju pakalpojuma konfigurācijas failā, kā parādīts zemāk esošajā koda fragmentā, deklaratīvi varat konfigurēt rekvizītus maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Rekvizīts maxConcurrentCalls tiek izmantots, lai ierobežotu kopējo zvanu skaitu visās pakalpojumu instancēs. Noklusējuma vērtība ir 16 vienam procesoram. Rekvizītu maxConcurrentInstances izmanto, lai norādītu kopējo pakalpojumu gadījumu skaitu, kurus var piešķirt noteiktā laika posmā. Šī rekvizīta noklusējuma vērtība ir Int32.MaxValue. Rekvizīts maxConcurrentSessions tiek izmantots, lai norādītu kopējo aktīvo sesiju skaitu, kas ir atļauts pakalpojumam noteiktā laika posmā. Noklusējuma vērtība ir 100 vienam procesoram.

Tagad, kad mēs zinām, kā deklaratīvi konfigurēt pakalpojumu ierobežošanu WCF, izpētīsim, kā mēs varam programmiski konfigurēt pakalpojumu ierobežošanu WCF. Lai programmatiski konfigurētu pakalpojumu ierobežošanu WCF, jums jāizmanto klases ServiceThrottlingBehavior priekšrocības. Šis kodu saraksts parāda, kā jūs varat izmantot klases ServiceThrottlingBehavior priekšrocības, lai konfigurētu vienlaicīgos zvanus, sesiju un instanču rekvizītus.

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

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

ja (throttleBehavior == null)

            {

throttleBehavior = jauns ServiceThrottlingBehavior ();

throttleBehavior.MaxConcurrentCalls = 1000;

droseļvārstsBehavior.MaxConcurrentSessions = 250;

droseļvārstsBehavior.MaxConcurrentInstances = 500;

serviceHost.Description.Behaviors.Add (throttleBehavior);

            }

Iepriekš minētajā koda fragmentā tiek izveidots ServiceThrottlingBehavior gadījums un tā īpašībām tiek iestatītas atbilstošās vērtības. Pēc tam šī instance tiek pievienota pakalpojuma resursdatora instances uzvedības kolekcijai.