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.