Ohjelmointi

Tutkitaan instanssia, samanaikaisuutta ja kuristamista WCF: ssä

Työskennellessäsi WCF: ssä sinun tulee olla tietoinen instancoinnin, kuristamisen ja samanaikaisuuden käsitteistä rakentaaksesi palveluja, jotka ovat skaalautuvia ja voivat tarjota paremman suorituskyvyn.

Ohjausta WCF: ssä käytetään palvelun läpimenon rajoittamiseen siten, että resurssien kulutus (muisti, prosessori, levy, verkko jne.) Järjestelmässä on hyväksyttävällä tasolla, eli varmista, että palvelu ei kuluta resursseja hyväksyttävien rajojen ulkopuolella. ServiceThrottlingBehavior-luokkaa voidaan käyttää WCF-palveluiden suorituskyvyn hallintaan.

Samanaikaisuus

WCF: ssä samanaikaisuusongelmia voi syntyä, kun kaksi tai useampi ketju yrittää käyttää samaa resurssia samanaikaisesti. Huomaa, että WCF-palvelu voi käsitellä yhtä yksittäistä pyyntöä kerrallaan. Samanaikaisuus WCF: ssä antaa sinun hallita useita aktiivisia säikeitä Instancekontekstissa tiettynä ajankohtana. Pohjimmiltaan se auttaa sinua määrittämään useita palveluilmentymiä, jotka voivat palvella useita samanaikaisia ​​pyyntöjä. Kolme mahdollista samanaikaisuustilaa ovat seuraavat:

Yhden samanaikaisuuden tila: Tässä tilassa kussakin instanssikontekstissa voi olla enintään yksi ketju, joka voi käsitellä pyynnön tiettynä ajankohtana. Kun seuraava pyyntö saapuu, sen on odotettava, kunnes ensimmäinen pyyntö on valmis. Tämä aiheuttaa myös synkronointilukkojen tarpeen. Seuraava koodinpätkä kuvaa, kuinka yhtä samanaikaisuutta voidaan käyttää.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

julkisen luokan palvelu: IServiceContract

{

julkinen merkkijono GetMessage ()

     {

palauta "Hei maailma!";

     }

}

Useita samanaikaisuustiloja: Tässä tilassa palvelu sallii useiden ketjujen pääsyn palvelutoimintaan samaan aikaan. Usean samanaikaisuuden toimintatilassa jokaisella WCF-palvelulla on useita säikeitä, jotka puolestaan ​​voivat käsitellä saapuvia pyyntöjä samanaikaisesti.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

julkisen luokan palvelu: IServiceContract

{

readonly object lockObj = uusi objekti ();

julkinen merkkijono GetMessage ()

    {

merkkijono viesti = merkkijono.Tyhjä;

lukko (lockObj)

        {

message = "Hei maailma!";

        }

palautusviesti;

    }

}

Palautuvan samanaikaisuuden tila: Reentrant-toimintatilassa, vaikka yksittäinen ketju voi käyttää palveluobjektia, säie voi silti poistua palvelusta ja soittaa sitten toiselle palvelulle. Seuraava koodinpätkä osoittaa, kuinka voit ottaa tämän tilan käyttöön.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

julkisen luokan palvelu: IServiceContract

{

julkinen merkkijono GetMessage ()

     {

palauta "Hei maailma!";

     }

}

Ominaisuutta instanceContextMode käytetään määrittämään, milloin palvelun ilmentymä luodaan, ja sen kestävyyden. Huomaa, että sekä instanceContextMode että ConcurrencyMode määritetään ServiceBehaviorAttribute-toiminnolla. Kolme käytettävissä olevaa ilmentymän kontekstimoodin arvoa ovat: PerCall, PerSession ja Single. PerCall-tilassa palvelu on yksisäikeinen ja tilaton. PerSession-tila on oletusarvo, ja sitä käytetään, kun haluat säilyttää tilatiedot samalta palvelukuluttajalta soitettujen puhelujen välillä. Yksittäistilaa käytetään, kun palvelusi on ylläpidettävä tilatietoja kaikissa asiakkaissa, eikä sinun tarvitse tulevaisuudessa laajentaa palvelua.

Kuristaminen

Voit hyödyntää kuristusta hallita ja optimoida resurssien käyttöä ja saavuttaa tapa tasapainottaa palvelun suorituskykyä. Kaasuttaminen WCF: ssä voidaan määrittää sekä deklaratiivisesti että ohjelmallisesti.

Voit määrittää ominaisuudet maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions deklaratiivisesti käyttämällä palvelun määritystiedoston tagia alla olevan koodinpätkän mukaisesti.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Ominaisuutta maxConcurrentCalls käytetään rajoittamaan puheluiden kokonaismäärää kaikissa palvelukokonaisuuksissa. Oletusarvo on 16 prosessoria kohden. Ominaisuutta maxConcurrentInstances käytetään määrittämään tiettyyn ajankohtaan allokoitavien palvelun instanssien kokonaismäärä. Tämän ominaisuuden oletusarvo on Int32.MaxValue. Ominaisuutta maxConcurrentSessions käytetään määrittämään samanaikaisten aktiivisten istuntojen kokonaismäärä, joka on sallittu palvelulle tiettynä ajankohtana. Oletusarvo on 100 prosessoria kohden.

Nyt kun tiedämme kuinka määrittää palvelun rajoitukset WCF: ssä deklaratiivisesti, tutkitaan, miten voimme määrittää palvelun rajoitukset WCF: ssä ohjelmallisesti. Jos haluat määrittää palvelun rajoituksen WCF: ssä ohjelmallisesti, sinun on hyödynnettävä ServiceThrottlingBehavior-luokkaa. Seuraava koodiluettelo näyttää, kuinka voit käyttää ServiceThrottlingBehavior-luokkaa hyödyntäessäsi samanaikaisten puheluiden, istunnon ja ilmentymän ominaisuuksien määrittämistä.

ServiceHost serviceHost = uusi ServiceHost (typeof (palvelu));

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

if (kaasukäyttäytyminen == null)

            {

throttleBehavior = uusi palveluTrottlingBehavior ();

throttleBehavior.MaxConcurrentCalls = 1000;

throttleBehavior.MaxConcurrentSessions = 250;

kuristinBevavior.MaxConcurrentInstances = 500;

serviceHost.Description.Behaviors.Add (throttleBehavior);

            }

Yllä olevassa koodinpätkässä luodaan ServiceThrottlingBehavior-ilmentymä ja asetetaan sen ominaisuuksille sopivat arvot. Seuraavaksi tämä ilmentymä lisätään palvelun isännän ilmentymän Behaviors-kokoelmaan.