Programmering

Utforske instancing, samtidighet og struping i WCF

Når du jobber i WCF, bør du være klar over begrepene instancing, throttling og concurrency for å bygge tjenester som er skalerbare og kan gi bedre gjennomstrømning.

Throttling i WCF brukes til å begrense tjenestegjennomstrømningen slik at ressursforbruket (minne, prosessor, disk, nettverk, etc.) i systemet er på et akseptabelt nivå, dvs. sikre at tjenesten ikke bruker ressurser ut over akseptable grenser. ServiceThrottlingBehavior-klassen kan brukes til å kontrollere ytelsen til WCF-tjenester.

Samtidighet

I WCF kan problemer med samtidighet oppstå når to eller flere tråder prøver å få tilgang til samme ressurs samtidig. Merk at en WCF-tjeneste kan håndtere en enkelt forespørsel om gangen. Samtidighet i WCF lar deg kontrollere flere aktive tråder i en InstanceContext på et bestemt tidspunkt. I hovedsak hjelper det deg å konfigurere antall tjenesteforekomster som kan tjene flere samtidige forespørsler. De tre mulige typene samtidighetsmodi inkluderer følgende:

Enkelt samtidighetsmodus: I denne modusen kan hver forekomstskontekst ha maksimalt en tråd som kan behandle forespørselen på et bestemt tidspunkt. Når neste forespørsel kommer, må den vente til den første forespørselen er fullført. Dette medfører også behovet for synkroniseringslås. Følgende kodebit illustrerer hvordan enkelt samtidighetsmodus kan brukes.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

offentlig klasse Service: IServiceContract

{

offentlig streng GetMessage ()

     {

returner "Hello World!";

     }

}

Flere samtidige modus: I denne modusen gir tjenesten flere tråder tilgang til en tjenesteoperasjon på samme tidspunkt. I operasjonsmodusen med flere samtidigheter har hver WCF-tjeneste flere tråder som igjen kan behandle innkommende forespørsler samtidig.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

offentlig klasse Service: IServiceContract

{

skrivebeskyttet objektlåsObj = nytt objekt ();

offentlig streng GetMessage ()

    {

strengmelding = streng.Tom;

lås (lockObj)

        {

message = "Hello World!";

        }

returmelding;

    }

}

Reentrant samtidighetsmodus: I reentrant-modus, selv om en enkelt tråd kan få tilgang til tjenesteobjektet, kan tråden fortsatt avslutte tjenesten og deretter ringe en annen tjeneste. Følgende kodebit viser hvordan du kan implementere denne modusen.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

offentlig klasse Service: IServiceContract

{

offentlig streng GetMessage ()

     {

returner "Hello World!";

     }

}

InstanceContextMode-egenskapen brukes til å spesifisere når en forekomst av tjenesten skal opprettes og dens holdbarhet. Merk at både InstanceContextMode og ConcurrencyMode er spesifisert ved hjelp av ServiceBehaviorAttribute. De tre tilgjengelige kontekstmodusverdiene inkluderer: PerCall, PerSession og Single. I PerCall-modus er tjenesten enkelttrådet og statsløs. PerSession-modus er standard og brukes når du ønsker å opprettholde tilstandsinformasjon mellom samtaler som stammer fra samme tjenesteforbruker. Enkeltmodus brukes når tjenesten din trenger å opprettholde tilstandsinformasjon på tvers av klienter, og du ikke trenger å skalere ut tjenesten din i fremtiden.

Struping

Du kan utnytte gasspjeld for å kontrollere og optimalisere ressursbruken og også for å oppnå en måte å balansere ytelsen på tjenesten. Demping i WCF kan konfigureres så vel som programmatisk.

Du kan konfigurere egenskapene maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions deklarativt ved hjelp av taggen i tjenestekonfigurasjonsfilen som vist i kodebiten nedenfor.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Egenskapen maxConcurrentCalls brukes til å begrense det totale antallet samtaler på tvers av alle tjenesteforekomster. Standardverdien er 16 per prosessor. Egenskapen maxConcurrentInstances brukes til å spesifisere det totale antallet tjenesteforekomster som kan tildeles på et bestemt tidspunkt. Standardverdien for denne egenskapen er Int32.MaxValue. Egenskapen maxConcurrentSessions brukes til å spesifisere det totale antallet samtidige aktive økter som er tillatt for en tjeneste på et gitt tidspunkt. Standardverdien er 100 per prosessor.

Nå som vi vet hvordan vi skal konfigurere tjenestegas i WCF erklærende, la oss utforske hvordan vi kan konfigurere tjenestegass i WCF programmatisk. For å konfigurere tjenestegas i WCF programmatisk, må du dra nytte av klassen ServiceThrottlingBehavior. Følgende kodeliste viser hvordan du kan dra nytte av klassen ServiceThrottlingBehavior for å konfigurere samtidige anrops-, økt- og forekomstegenskaper.

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

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

hvis (throttleBehavior == null)

            {

throttleBehavior = ny ServiceThrottlingBehavior ();

throttleBehavior.MaxConcurrentCalls = 1000;

throttleBehavior.MaxConcurrentSessions = 250;

throttleBehavior.MaxConcurrentInstances = 500;

serviceHost.Description.Behaviors.Add (throttleBehavior);

            }

I kodebiten ovenfor opprettes en forekomst av ServiceThrottlingBehavior og egenskapene settes til de riktige verdiene. Deretter legges denne forekomsten til Behaviors-samlingen av tjenestevertsforekomsten.

$config[zx-auto] not found$config[zx-overlay] not found