Programmering

Udforsk instancing, concurrency og throttling i WCF

Når du arbejder i WCF, skal du være opmærksom på begreberne instancing, throttling og concurrency for at opbygge tjenester, der er skalerbare og kan give bedre gennemstrømning.

Throttling i WCF bruges til at begrænse tjenestegennemstrømningen, så ressourceforbruget (hukommelse, processor, disk, netværk osv.) I systemet er på et acceptabelt niveau, dvs. sikre, at tjenesten ikke bruger ressourcer ud over acceptable grænser. Klassen ServiceThrottlingBehavior kan bruges til at styre udførelsen af ​​WCF-tjenester.

Samtidighed

I WCF kan der opstå problemer med samtidighed, når to eller flere tråde forsøger at få adgang til den samme ressource på samme tid. Bemærk, at en WCF-tjeneste kan håndtere en enkelt anmodning ad gangen. Samtidighed i WCF giver dig mulighed for at kontrollere flere aktive tråde i en InstanceContext på et bestemt tidspunkt. I det væsentlige hjælper det dig med at konfigurere antallet af serviceinstanser, der kan betjene flere samtidige anmodninger. De tre mulige typer samtidige tilstande inkluderer følgende:

Enkelt samtidighedstilstand: I denne tilstand kan hver forekomstskontekst have maksimalt en tråd, der kan behandle anmodningen på et bestemt tidspunkt. Når den næste anmodning ankommer, skal den vente, indtil den første anmodning er afsluttet. Dette medfører også behovet for synkroniseringslåse. Følgende kodestykke illustrerer, hvordan enkelt samtidighedstilstand kan bruges.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

offentlig klasseservice: IServiceContract

{

offentlig streng GetMessage ()

     {

returner "Hello World!";

     }

}

Flere samtidige tilstand: I denne tilstand giver tjenesten flere tråde adgang til en servicefunktion på samme tidspunkt. I driften med flere samtidige funktioner har hver WCF-tjeneste flere tråde, som igen kan behandle de indgående anmodninger samtidigt.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

offentlig klasseservice: IServiceContract

{

readonly objekt lockObj = nyt objekt ();

offentlig streng GetMessage ()

    {

streng besked = streng. tom;

lås (lockObj)

        {

message = "Hej verden!";

        }

returnere besked;

    }

}

Reentrant samtidighedstilstand: Selvom en enkelt tråd kan få adgang til serviceobjektet, kan den stadig forlade tjenesten og derefter ringe til en anden tjeneste, når den fungerer igen. Følgende kodestykke viser, hvordan du kan implementere denne tilstand.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

offentlig klasseservice: IServiceContract

{

offentlig streng GetMessage ()

     {

returner "Hello World!";

     }

}

Egenskaben InstanceContextMode bruges til at angive, hvornår en forekomst af tjenesten oprettes, og dens holdbarhed. Bemærk, at både InstanceContextMode og ConcurrencyMode er specificeret ved hjælp af ServiceBehaviorAttribute. De tre tilgængelige instanskonteksttilstandsværdier inkluderer: PerCall, PerSession og Single. I PerCall-tilstand er tjenesten enkelt gevind og statsløs. PerSession-tilstanden er standard og bruges, når du vil bevare statusoplysninger mellem opkald, der stammer fra den samme serviceforbruger. Enkelttilstanden bruges, når din tjeneste har brug for at opretholde tilstandsoplysninger på tværs af klienter, og du ikke behøver at skalere din tjeneste i fremtiden.

Begrænsning

Du kan udnytte gasregulering til at kontrollere og optimere ressourceforbruget og også for at opnå en måde at afbalancere serviceydelsen på. Drossel i WCF kan konfigureres såvel erklæringsmæssigt som programmatisk.

Du kan konfigurere egenskaberne maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions deklarativt ved hjælp af tagget i servicekonfigurationsfilen som vist i kodestykket nedenfor.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Ejendommen maxConcurrentCalls bruges til at begrænse det samlede antal opkald på tværs af alle serviceinstanser. Standardværdien er 16 pr. Processor. Egenskaben maxConcurrentInstances bruges til at specificere det samlede antal serviceinstanser, der kan tildeles på et bestemt tidspunkt. Standardværdien af ​​denne egenskab er Int32.MaxValue. Egenskaben maxConcurrentSessions bruges til at specificere det samlede antal samtidige aktive sessioner, der er tilladt for en tjeneste på et givet tidspunkt. Standardværdien er 100 pr. Processor.

Nu hvor vi ved, hvordan vi konfigurerer servicegasregulering i WCF erklærende, skal vi undersøge, hvordan vi kan konfigurere servicegashindring i WCF programmatisk. For at konfigurere servicegas i WCF programmatisk, skal du udnytte klassen ServiceThrottlingBehavior. Følgende kodeliste viser, hvordan du kan drage fordel af klassen ServiceThrottlingBehavior til at konfigurere de samtidige opkald, session og instansegenskaber.

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 ovenstående kodestykke oprettes en forekomst af ServiceThrottlingBehavior, og dens egenskaber indstilles til de relevante værdier. Dernæst føjes denne instans til Behaviors-samlingen af ​​service-værtsinstansen.

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