Programovanie

Skúmanie inštancie, súbežnosti a škrtenia v WCF

Pri práci v WCF by ste si mali byť vedomí konceptov instancingu, škrtenia a súbežnosti pri vytváraní služieb, ktoré sú škálovateľné a môžu poskytovať lepšiu priepustnosť.

Škrtenie v WCF sa používa na obmedzenie priepustnosti služby tak, aby spotreba zdrojov (pamäť, procesor, disk, sieť atď.) V systéme bola na prijateľnej úrovni, t. J. Zabezpečte, aby služba nespotrebovávala zdroje nad prijateľné limity. Triedu ServiceThrottlingBehavior možno použiť na riadenie výkonu služieb WCF.

Súbežnosť

Vo WCF môžu nastať problémy so súbežnosťou, keď sa dve alebo viac vlákien pokúsi získať prístup k rovnakému prostriedku súčasne. Upozorňujeme, že služba WCF dokáže vybaviť naraz iba jednu požiadavku. Súbežnosť vo WCF vám umožňuje ovládať viac aktívnych vlákien v InstanceContext v konkrétnom okamihu. V zásade vám pomôže nakonfigurovať počet inštancií služieb, ktoré môžu slúžiť viacerým súbežným požiadavkám. Tri možné typy režimov súbežnosti zahŕňajú:

Režim jednej súbežnosti: V tomto režime môže mať každý inštančný kontext maximálne jedno vlákno, ktoré dokáže spracovať požiadavku v konkrétnom okamihu. Keď príde ďalšia žiadosť, musí počkať, kým sa prvá žiadosť dokončí. Z toho tiež vyplýva potreba synchronizačných zámkov. Nasledujúci úryvok kódu ilustruje, ako je možné použiť režim jednej súbežnosti.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

služba verejnej triedy: IServiceContract

{

verejný reťazec GetMessage ()

     {

návrat „Hello World!“;

     }

}

Režim viacerých súbežností: V tomto režime služba umožňuje viacerým vláknam prístup k operácii služby v rovnakom okamihu. V režime prevádzky s viacerými súbežnosťami má každá služba WCF viac vlákien, ktoré môžu súčasne spracovávať prichádzajúce požiadavky súčasne.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

služba verejnej triedy: IServiceContract

{

readonly object lockObj = nový objekt ();

verejný reťazec GetMessage ()

    {

string message = string.Empty;

zámok (lockObj)

        {

message = "Hello World!";

        }

spätná správa;

    }

}

Režim opakovaného zadania súbežnosti: V reentrantnom prevádzkovom režime môže síce jedno vlákno pristupovať k objektu služby, ale vlákno môže stále službu opustiť a potom zavolať inú službu. Nasledujúci úryvok kódu ukazuje, ako môžete implementovať tento režim.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

služba verejnej triedy: IServiceContract

{

verejný reťazec GetMessage ()

     {

návrat „Hello World!“;

     }

}

Vlastnosť InstanceContextMode sa používa na určenie, kedy sa vytvorí inštancia služby a jej trvanlivosť. Všimnite si, že InstanceContextMode aj ConcurrencyMode sa určujú pomocou ServiceBehaviorAttribute. Tri dostupné hodnoty kontextu kontextu inštancie zahŕňajú: PerCall, PerSession a Single. V režime PerCall je služba s jedným vláknom a je bez štátnej príslušnosti. Režim PerSession je predvolený a používa sa, ak chcete zachovať informácie o stave medzi hovormi od rovnakého spotrebiteľa. Režim Single sa používa, keď vaša služba potrebuje udržiavať informácie o stave naprieč klientmi a vy by ste v budúcnosti nemuseli svoju službu škálovať.

Škrtenie

Škrtenie môžete využiť na riadenie a optimalizáciu využívania zdrojov a tiež na dosiahnutie spôsobu vyváženia výkonu služieb. Škrtenie v WCF je možné nakonfigurovať deklaratívne aj programovo.

Vlastnosti maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions môžete deklaratívne nakonfigurovať pomocou značky v konfiguračnom súbore služby, ako je uvedené v útržku kódu nižšie.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Vlastnosť maxConcurrentCalls sa používa na obmedzenie celkového počtu hovorov vo všetkých inštanciách služby. Predvolená hodnota je 16 na procesor. Vlastnosť maxConcurrentInstances sa používa na určenie celkového počtu inštancií služby, ktoré je možné prideliť v konkrétnom okamihu. Predvolená hodnota tejto vlastnosti je Int32.MaxValue. Vlastnosť maxConcurrentSessions sa používa na zadanie celkového počtu súbežných aktívnych relácií, ktorý je povolený pre službu v danom okamihu. Predvolená hodnota je 100 na procesor.

Teraz, keď vieme, ako deklaratívne nakonfigurovať obmedzenie služby v WCF, poďme sa pozrieť na to, ako môžeme programovo nakonfigurovať obmedzenie služby v WCF. Ak chcete programovo obmedziť obmedzenie služby v WCF, budete musieť využiť výhodu triedy ServiceThrottlingBehavior. Nasledujúci zoznam kódov ukazuje, ako môžete využiť výhodu triedy ServiceThrottlingBehavior na konfiguráciu súbežných hovorov, vlastností relácie a inštancie.

ServiceHost serviceHost = nový ServiceHost (typeof (Service));

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

if (throttleBehavior == null)

            {

throttleBehavior = nový ServiceThrottlingBehavior ();

throttleBehavior.MaxConcurrentCalls = 1000;

throttleBehavior.MaxConcurrentSessions = 250;

throttleBehavior.MaxConcurrentInstances = 500;

serviceHost.Description.Behaviors.Add (throttleBehavior);

            }

Vo vyššie uvedenom útržku kódu sa vytvorí inštancia ServiceThrottlingBehavior a jej vlastnosti sa nastavia na príslušné hodnoty. Ďalej sa táto inštancia pridá do kolekcie Správanie inštancie hostiteľa služby.

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