Programování

Zkoumání instancování, souběžnosti a škrcení v WCF

Při práci v WCF byste si měli být vědomi konceptů instancování, omezování a souběžnosti při vytváření služeb, které jsou škálovatelné a mohou poskytovat lepší propustnost.

Omezení v WCF se používá k omezení propustnosti služby tak, aby spotřeba prostředků (paměť, procesor, disk, síť atd.) V systému byla na přijatelné úrovni, tj. Zajistila, aby služba nespotřebovávala prostředky nad přijatelné limity. Třídu ServiceThrottlingBehavior lze použít k řízení výkonu služeb WCF.

Konkurence

V WCF mohou nastat problémy se souběžností, když se dvě nebo více vláken pokusí o přístup ke stejnému prostředku současně. Všimněte si, že služba WCF může zpracovávat pouze jeden požadavek najednou. Souběžnost v WCF umožňuje ovládat více aktivních vláken v InstanceContext v určitém okamžiku. V podstatě vám pomůže nakonfigurovat počet instancí služby, které mohou obsloužit více souběžných požadavků. Tři možné typy režimů souběžnosti zahrnují následující:

Režim jedné souběžnosti: V tomto režimu může mít každý kontext instance maximálně jedno vlákno, které dokáže zpracovat požadavek v určitém okamžiku. Když dorazí další požadavek, musí počkat, dokud nebude dokončen první požadavek. To také vyvolává potřebu synchronizačních zámků. Následující fragment kódu ukazuje, jak lze použít režim jedné souběžnosti.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

služba veřejné třídy: IServiceContract

{

veřejný řetězec GetMessage ()

     {

návrat "Hello World!";

     }

}

Režim vícenásobné souběžnosti: V tomto režimu služba umožňuje více vláknům přístup k operaci služby ve stejném okamžiku. V režimu provozu více souběžností má každá služba WCF více vláken, která zase mohou zpracovávat příchozí požadavky souběžně.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

služba veřejné třídy: IServiceContract

{

readonly object lockObj = nový objekt ();

veřejný řetězec GetMessage ()

    {

string message = string.Empty;

zámek (lockObj)

        {

message = "Ahoj světe!";

        }

zpětná zpráva;

    }

}

Reentrantní režim souběžnosti: V reentrantním provozním režimu, i když může jedno vlákno přistupovat k objektu služby, může vlákno stále opustit službu a poté volat jinou službu. Následující fragment kódu ukazuje, jak můžete tento režim implementovat.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

služba veřejné třídy: IServiceContract

{

veřejný řetězec GetMessage ()

     {

návrat "Hello World!";

     }

}

Vlastnost InstanceContextMode se používá k určení, kdy bude vytvořena instance služby a její trvanlivost. Všimněte si, že InstanceContextMode a ConcurrencyMode jsou zadány pomocí ServiceBehaviorAttribute. Mezi tři dostupné hodnoty kontextu kontextu instance patří: PerCall, PerSession a Single. V režimu PerCall je služba s jedním vláknem a je bez státní příslušnosti. Režim PerSession je výchozí a používá se, pokud chcete zachovat informace o stavu mezi hovory pocházejícími od stejného spotřebitele služby. Režim Single se používá, když vaše služba potřebuje udržovat informace o stavu napříč klienty a vy byste v budoucnu nemuseli škálovat svou službu.

Škrcení

Omezení můžete využít k řízení a optimalizaci využití prostředků a také k dosažení způsobu vyvážení výkonu služby. Omezení v WCF lze konfigurovat deklarativně i programově.

Vlastnosti maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions můžete konfigurovat deklarativně pomocí značky v konfiguračním souboru služby, jak je znázorněno v úryvku kódu níže.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Vlastnost maxConcurrentCalls se používá k omezení celkového počtu hovorů ve všech instancích služby. Výchozí hodnota je 16 na procesor. Vlastnost maxConcurrentInstances se používá k určení celkového počtu instancí služby, které lze přidělit v určitém okamžiku. Výchozí hodnota této vlastnosti je Int32.MaxValue. Vlastnost maxConcurrentSessions se používá k určení celkového počtu souběžných aktivních relací, který je pro službu v daném okamžiku přípustný. Výchozí hodnota je 100 na procesor.

Teď, když víme, jak deklarativně nakonfigurovat omezení služby ve WCF, prozkoumejme, jak můžeme programově nakonfigurovat omezení služeb ve WCF. Chcete-li programově omezit omezení služby v WCF, budete muset využít výhodu třídy ServiceThrottlingBehavior. Následující výpis kódu ukazuje, jak můžete využít ServiceThrottlingBehavior třídu ke konfiguraci souběžných volání, vlastností relace a instance.

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);

            }

Ve výše uvedeném fragmentu kódu je vytvořena instance ServiceThrottlingBehavior a její vlastnosti jsou nastaveny na příslušné hodnoty. Dále se tato instance přidá do kolekce Behaviors instance hostitele služby.