Sei sulla pagina 1di 15

WCF Concurrency (Single, Multiple and Reentrant) and Throttling

Introduction and Goal


Pre-requisite
Why do we need concurrency in WCF?
WCF concurrency and instancing – two different things
Three types of WCF concurrency
By default WCF services are Single concurrency – Sample code demonstration
9 combinations of Instancing and Concurrency
Instance mode = Per Call and Concurrency = Single
Instance mode = per Call and Concurrency = Multiple
Instance mode = per session and Concurrency = single
Instance mode = per session and Concurrency = Multiple
Instance mode = Single and Concurrency = Single
Instance mode = Single and Concurrency = Multiple
Reentrant
Throttling behavior
Default values for WCF throttling
Reference

INTRODUCTION AND GOAL

In this article we will concentrate on WCF concurrency and throttling. We will first try to understand what are
WCF concurrency and the 3 important types of WCF concurrency. We will then see a small sample of WCF
concurrency with single and multiple. We will then go through 9 combinations of WCF concurrency and
instancing. Finally we will try to understand how to configure throttling using WCF ‘web.config’ file.

This is a small Ebook for all my .NET friends which covers topics like WCF,WPF,WWF,Ajax,Core
.NET,SQL,Design patterns , UML , Azure etc you can download the same from here or else you can catch
me on my daily free training @ fromhere

Courtesy: - http://www.nassaulibrary.org/ncla/nclacler_files/LILC7.JPG
PRE-REQUISITE

In order to understand WCF concurrency well, it’s important to understand concepts around WCF
instancing. So before moving ahead with this article please do once read WCF instancing from here

WHY DO WE NEED CONCURRENCY IN WCF?

If you search on the web for the dictionary meaning of concurrency you will find the following definition:-

“Happening at the same time”

WCF concurrency helps us to configure how WCF service instances can serve multiple requests at the
same time. You will need WCF concurrency for the below prime reasons, there can be other reasons as well
but these stand out as important reasons:-

Increase through put: - Many times you want to increase the amount of work your WCF service instance
does at any moment of time, in other words you would like to increase the through put. Throughput means
how much work a given thing can do. By default WCF service handles only one request at given moment of
time.

Integration with legacy system: - Many times your WCF services interact with legacy systems like VB6
COM etc. It’s very much possible that these systems are not multithreaded, in other words they handle only
one request at any given moment of time. So even though your WCF service has concurrent capabilities you
would like still to handle one request at a one time. This is achieved by using throttling in combination with
WCF concurrency capabilities.

WCF CONCURRENCY AND INSTANCING – TWO DIFFERENT THINGS

In our previous article we had discussed about WCF instances. WCF instancing and WCF concurrency are
two different things. WCF instance dictates how the objects are created while WCF concurrency dictates
how many requests can be handled by the WCF objects. I do understand that many of our developer’s
friends know this difference, but as you go deeper in WCF concurrency there is lot of connection with WCF
instancing also, so wanted to just emphasize the differences.

WCF instancing gives three levels of WCF object instance controls per call, per session and single. In case
you are not aware of the same do read my article 3 way to do WCF instance management . In similar lines
WCF concurrency also have 3 ways of implementing WCF concurrency.
THREE TYPES OF WCF CONCURRENCY

There are three ways by which you can handle concurrency in WCF Single, multiple and reentrant. To
specify WCF concurrency we need to use the ‘ServiceBehavior’ tag as shown below with appropriate
‘ConCurrencyMode’ property value.

Single: - A single request has access to the WCF service object at a given moment of time. So only one
request will be processed at any given moment of time. The other requests have to wait until the request
processed by the WCF service is not completed.

Multiple: - In this scenario multiple requests can be handled by the WCF service object at any given
moment of time. In other words request are processed at the same time by spawning multiple threads on the
WCF server object.
So you have great a throughput here but you need to ensure concurrency issues related to WCF server
objects.

Reentrant: - A single request thread has access to the WCF service object, but the thread can exit the WCF
service to call another WCF service or can also call WCF client through callback and reenter without
deadlock.

BY DEFAULT WCF SERVICES ARE SINGLE CONCURRENCY – SAMPLE CODE DEMONSTRATION

By default WCF services are set to concurrency type ‘single’ and instancing mode ‘per call’. In order to
demonstrate the same, let’s create a simple sample code as shown below. We will create a simple WCF
service with a method name called as ‘Call’. When any client calls this WCF service it will display the
following details:-
• Client name that made the call. This value will be provided as an input when the client wants to make call
to the WCF service.
• Instance number, this will represent number of WCF instance count which is serving the request.
• Thread number which is executing the method.
• Time when the ‘Call’ method was actually called.

Below is the service contract of the ‘Call’ method. Please note that the ‘OperationContract’ is defined as
‘IsOneWay’ true.

[ServiceContract]
public interface IHelloWorldService
{
[OperationContract(IsOneWay=true)]
void Call(string ClientName);
}

Below is the simple implementation of the service contract ‘IHelloWorldService’ interface defined below. It
has a instance variable ‘i’ which helps us to maintain the instance counter and simple console.writeline
which displays client name, instance number , thread number and time when the
method was called.
This method waits for 5 seconds using the ‘Thread.Sleep’ function.

public class HelloWorldService : IHelloWorldService


{
// maintain instance count
public int i;
public void Call(string ClientName)
{
// increment instance counts
i++;

// display client name, instance number , thread number and time when
// the method was called

Console.WriteLine("Client name :" + ClientName + " Instance:" +


i.ToString() + " Thread:" +
Thread.CurrentThread.ManagedThreadId.ToString() + " Time:" +
DateTime.Now.ToString() + "\n\n");

// Wait for 5 seconds


Thread.Sleep(5000);
}}

This WCF service will be self hosted using ‘WsHttpBinding’ as shown below. We have chosen self hosting
so that we can monitor the time, threads and number of
instances of WCF service.
static void Main(string[] args)
{
//Create a URI to serve as the base address
Uri httpUrl = new Uri("http://localhost:8010/MyService/HelloWorld");

//Create ServiceHost
ServiceHost host = new
ServiceHost(typeof(ClassLibrary1.HelloWorldService), httpUrl);

//Add a service endpoint


host.AddServiceEndpoint(typeof(ClassLibrary1.IHelloWorldService), new
WSHttpBinding(), "");

//Enable metadata exchange


ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);

//Start the Service


host.Open();

Console.WriteLine("Service is host at " + DateTime.Now.ToString());


Console.WriteLine("Host is running... Press <Enter> key to stop");
Console.ReadLine();
}

From the client side we will make 5 continuous calls simultaneously on the WCF service. Below is the code
snippet for the same.

Console.WriteLine("Enter Client name");


string str = Console.ReadLine();
ServiceReference1.HelloWorldServiceClient obj = new
ServiceReference1.HelloWorldServiceClient();

for(int i=0;i<5;i++)
{
obj.Call(str);
}

If you run the above project and monitor your WCF server service you will see the screen shot. There are 2
important points to note:-

• By default the WCF service is configure to run with instance mode of per call. So new instances are
created every time the service runs. Instance 1, 2, 3 and 4 indicate new instances created for every method
call.
• By default the concurrency is single so same thread is use to service all the 5 request’s which are sent
from the WCF client side. You can see the value of the thread is always 4.
• The most important factor is time. As the concurrency is configured as single it will be called one after
another sequentially. You can notice the same from the time difference of method call of 5 seconds.

Let’s go and change the concurrency mode to multiple. In order to change the concurrency mode to multiple
we need to specify ‘Multiple’ in the concurrency mode as shown in the below code snippet.

If you run the client now you can see different threads (i.e. thread 4, 5, 6, 7 and 8) are spawned to serve the
request and the time of the method calls are almost same. In other words the methods are executed
concurrently on different threads.

In short you are now having higher throughput in less amount of time.

9 COMBINATIONS OF INSTANCING AND CONCURRENCY


There are 9 combination of concurrency and instancing methodology as shown in the below table. In the
further coming section we will discuss in more detail about the same.

Instance mode = Per Call and Concurrency = Single

Instance mode ‘PerCall’ with ‘Single’ concurrency is the default setting in WCF. We have already seen and
example and demonstration of the same.

With per call new WCF instances are created for every method calls made to the WCF server service. The
default concurrency is single so only one thread will be used to serve all instances
Below is a simple pictorial representation of what will happen in per call and single concurrency scenario:-

• For every client instance a single thread will be allocated.


• For every method call a new service instance will be created.
• A single thread will be used to serve all WCF instances generated from a single client instance.

If you refer the previous sample you can see how threads are same and the halt of 5 seconds on the WCF
service.
INSTANCE MODE = PER CALL AND CONCURRENCY = MULTIPLE

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloWorldService : IHelloWorldService
{
}

In this combination multiple instances are created for every call but multiple threads serve every method call
to WCF service instance. You can see in
the below figure we have two WCF service instance and every instance has multiple WCF service objects
created for every method call. Every method call is handled by multiple threads.

In the above sample if you remember we have multiple threads serving every method call and the time
difference between every method call is reduced considerably. The method calls are fired approximately
same time.
INSTANCE MODE = PER SESSION AND CONCURRENCY = SINGLE

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Single)]
public class HelloWorldService : IHelloWorldService
{
}

In this combination one WCF service instance is created for every WCF client session because the WCF
instance mode is set to per session. All the method
calls are executed in a sequential manner one by one. In other words only one thread is available for all
method calls for a particular service instance.

If you run the sample code with the per session and single combination mode you will find the same thread
executes all request with same WCF instance per session.

INSTANCE MODE = PER SESSION AND CONCURRENCY = MULTIPLE

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloWorldService : IHelloWorldService
{
}

In this combination one WCF instance is created for every WCF client session and every method call is run
over multiple threads. Below is the pictorial
representation of the same.

If you run the sample code attached with this article you will find same instance with every method call
running on different methods.
To get a better idea you can run with different client exe instance with different names as shown below. You
can notice how every client get his own WCF service instance with every method allocated to run on
different threads.

INSTANCE MODE = SINGLE AND CONCURRENCY = SINGLE

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Single)]
public class HelloWorldService : IHelloWorldService
{
}

In this combination only one instance of WCF service instance is created which serves all requests which
are sent from all WCF clients. These entire
requests are served using only one thread.
You can see in the below figure approximately one thread is assigned for every WCF client call and only one
instance of the WCF service is created.

INSTANCE MODE = SINGLE AND CONCURRENCY = MULTIPLE

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloWorldService : IHelloWorldService
{}

In this combination one WCF service instance is created for serve all WCF clients. All request are served
using multiple / different threads.

You can see from the output we have 6 threads serving 10 requests as compared previously we had
approximately only 2 threads.

REENTRANT

In mode only thread runs to serve all requests. If your WCF service makes an outbound call to some other
WCF service or makes a client call it releases the thread lock. In other words until the outbound call is
completed other WCF clients can make call.
THROTTLING BEHAVIOR

WCF throttling settings helps you to put an upper limit on number of concurrent calls, WCF instances and
concurrent session. WCF provides 3 ways by which you can define upper limits MaxConcurrentCalls,
MaxConcurrentInstances and MaxConcurrentSessions.

MaxConcurrentCalls: - Limits the number of concurrent requests that can be processed by WCF service
instances.
MaxConcurrentInstances: - Limits the number of service instances that can be allocated at a given time.
When it’s a PerCall services, this value matches the number of concurrent calls. For PerSession services,
this value equals the number of active session instances. This setting doesn’t matter for Single instancing
mode, because only one instance is ever created.
MaxConcurrentSessions: - Limits the number of active sessions allowed for the service.
All the above 3 setting can be defined in the ‘servicebehaviors’ tag as shown in the below XML snippet.

<serviceBehaviors>

<behavior name="serviceBehavior">

<serviceThrottling maxConcurrentCalls="16"

maxConcurrentInstances="2147483647" maxConcurrentSessions="10" />

</behavior>

</serviceBehaviors>

DEFAULT VALUES FOR WCF THROTTLING


Below is a simple table which shows default settings for throttling as per different WCF versions.

Potrebbero piacerti anche