Programavimas

Naršymas, lygiagretumas ir reguliavimas WCF

Dirbdami WCF, turėtumėte žinoti apie „instancing“, „throttling“ ir „concurrency“ sąvokas, kad kurtumėte tokias paslaugas, kurios būtų keičiamos ir galėtų suteikti geresnį pralaidumą.

„WCF“ reguliavimas naudojamas apriboti paslaugų pralaidumą, kad išteklių sunaudojimas (atmintis, procesorius, diskas, tinklas ir kt.) Sistemoje būtų priimtinas, t. „ServiceThrottlingBehavior“ klasė gali būti naudojama WCF paslaugų efektyvumui kontroliuoti.

Lygiagretumas

WCF atveju gali iškilti lygiagretumo problemų, kai dvi ar daugiau gijų vienu metu bando pasiekti tą patį šaltinį. Atkreipkite dėmesį, kad WCF paslauga vienu metu gali apdoroti vieną užklausą. WCF lygiagretumas leidžia jums valdyti kelias „ActiveContext“ aktyvias gijas tam tikru laiko momentu. Iš esmės tai padeda sukonfigūruoti paslaugų egzempliorių, galinčių aptarnauti kelias vienu metu pateiktas užklausas, skaičių. Trys galimi lygiagretumo režimų tipai yra šie:

Vieno lygiagretumo režimas: Šiuo režimu kiekviename egzemplioriaus kontekste gali būti daugiausia viena gija, kuri gali apdoroti užklausą tam tikru momentu. Kai ateina kitas prašymas, jis turi palaukti, kol bus įvykdytas pirmasis prašymas. Tai taip pat reikalauja sinchronizavimo spynų. Šis kodo fragmentas iliustruoja, kaip galima naudoti vienos kartos režimą.

[„ServiceBehavior“ („ConcurrencyMode“ = „ConcurrencyMode.Single“)]

viešosios klasės paslauga: „IServiceContract“

{

viešoji eilutė „GetMessage“ ()

     {

grįžti „Sveikas pasaulis!“;

     }

}

Keli lygiagretumo režimai: Šiuo režimu paslauga leidžia kelioms gijoms pasiekti paslaugos operaciją tuo pačiu metu. Veikiant keliais sutapimo režimais, kiekviena WCF paslauga turi kelias gijas, kurios savo ruožtu gali vienu metu apdoroti gaunamas užklausas.

[„ServiceBehavior“ („ConcurrencyMode“ = „ConcurrencyMode.Multiple“)]

viešosios klasės paslauga: „IServiceContract“

{

readonly object lockObj = naujas objektas ();

viešoji eilutė „GetMessage“ ()

    {

eilutės pranešimas = eilutė. Tuščias;

užraktas (lockObj)

        {

žinutė = "Labas pasaulis!";

        }

grąžinimo pranešimas;

    }

}

„Reentrant“ lygiagretumo režimas: Reintant darbo režimu, nors vienas siūlas gali pasiekti paslaugos objektą, gija vis tiek gali išeiti iš paslaugos ir paskambinti kitai tarnybai. Šis kodo fragmentas parodo, kaip galite įdiegti šį režimą.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

viešosios klasės paslauga: „IServiceContract“

{

viešoji eilutė „GetMessage“ ()

     {

grįžti „Sveikas pasaulis!“;

     }

}

Ypatybė „instanceContextMode“ naudojama nurodyti, kada bus sukurtas paslaugos egzempliorius, ir jos patvarumą. Atkreipkite dėmesį, kad tiek „instanceContextMode“, tiek „ConcurrencyMode“ nurodomi naudojant „ServiceBehaviorAttribute“. Trys galimos egzemplioriaus konteksto režimo vertės apima: „PerCall“, „PerSession“ ir „Single“. „PerCall“ režimu paslauga yra viena gija ir yra be pilietybės. „PerSession“ režimas yra numatytasis ir naudojamas, kai norite išsaugoti būsenos informaciją tarp to paties paslaugų vartotojo skambučių. Vienkartinis režimas naudojamas, kai jūsų tarnyba turi išlaikyti būsenos informaciją apie klientus ir ateityje jums nereikės išplėsti savo paslaugos.

Droselis

Galite valdyti ir optimizuoti išteklių naudojimą, taip pat siekdami subalansuoti paslaugų našumą, naudodamiesi reguliavimu. Droseliavimas WCF gali būti konfigūruojamas deklaratyviai ir programiškai.

Galite konfigūruoti ypatybes „maxConcurrentCalls“, „maxConcurrentInstances“, „maxConcurrentSessions“ deklaratyviai naudodami žymę paslaugų konfigūracijos faile, kaip parodyta žemiau esančiame kodo fragmente.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

„maxConcurrentSessions />“

       

     

   

Ypatybė „maxConcurrentCalls“ naudojama norint apriboti bendrą skambučių skaičių visose paslaugos egzemplioriuose. Numatytoji kiekvieno procesoriaus vertė yra 16. Ypatybė „maxConcurrentInstances“ naudojama nurodant bendrą paslaugų egzempliorių, kuriuos galima paskirstyti tam tikru momentu, skaičių. Numatytoji šios ypatybės vertė yra Int32.MaxValue. Ypatybė „maxConcurrentSessions“ naudojama nurodyti bendrą tuo pačiu metu aktyvių seansų skaičių, kuris yra leistinas paslaugai tam tikru laiko momentu. Numatytoji kiekvieno procesoriaus vertė yra 100.

Dabar, kai žinome, kaip paslaugų konfigūravimą WCF deklaratyviai konfigūruoti, panagrinėkime, kaip galime programiškai sukonfigūruoti paslaugų ribojimą WCF. Norėdami programiškai sukonfigūruoti paslaugų ribojimą WCF, turėtumėte pasinaudoti „ServiceThrottlingBehavior“ klase. Šiame kodų sąraše parodyta, kaip galite pasinaudoti „ServiceThrottlingBehavior“ klasės pranašumais, norėdami konfigūruoti vienu metu vykstančius skambučius, seanso ir egzempliorių ypatybes.

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

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

jei (droselio elgsena == nulis)

            {

throttleBehavior = nauja tarnybaTrottlingBehavior ();

throttleBehavior.MaxConcurrentCalls = 1000;

throttleBehavior.MaxConcurrentSessions = 250;

droselio sklendėBevavior.MaxConcurrentInstances = 500;

serviceHost.Description.Behaviors.Add (throttleBehavior);

            }

Pirmiau pateiktame kodo fragmente sukuriamas „ServiceThrottlingBehavior“ egzempliorius ir nustatomos jo ypatybės į atitinkamas reikšmes. Tada šis egzempliorius pridedamas prie tarnybos pagrindinio egzemplioriaus elgesio rinkinio.