WCF에서 인스턴스화, 동시성 및 제한 탐색

WCF에서 작업 할 때 확장 가능하고 더 나은 처리량을 제공 할 수있는 서비스를 빌드하기위한 인스턴스화, 제한 및 동시성의 개념을 알고 있어야합니다.

WCF의 제한은 시스템의 리소스 소비 (메모리, 프로세서, 디스크, 네트워크 등)가 허용 가능한 수준이되도록 서비스 처리량을 제한하는 데 사용됩니다. 즉, 서비스가 허용 가능한 한도를 초과하여 리소스를 소비하지 않도록합니다. ServiceThrottlingBehavior 클래스를 사용하여 WCF 서비스의 성능을 제어 할 수 있습니다.

동시성

WCF에서 두 개 이상의 스레드가 동시에 동일한 리소스에 액세스하려고하면 동시성 문제가 발생할 수 있습니다. WCF 서비스는 한 번에 하나의 단일 요청을 처리 할 수 ​​있습니다. WCF의 동시성을 사용하면 특정 시점에 InstanceContext의 여러 활성 스레드를 제어 할 수 있습니다. 본질적으로 여러 동시 요청을 처리 할 수있는 서비스 인스턴스 수를 구성하는 데 도움이됩니다. 세 가지 가능한 동시성 모드 유형은 다음과 같습니다.

단일 동시성 모드 : 이 모드에서 각 인스턴스 컨텍스트는 특정 시점에서 요청을 처리 할 수있는 최대 하나의 스레드를 가질 수 있습니다. 다음 요청이 도착하면 첫 번째 요청이 완료 될 때까지 기다려야합니다. 또한 동기화 잠금이 필요합니다. 다음 코드 스 니펫은 단일 동시성 모드를 사용하는 방법을 보여줍니다.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

공용 클래스 서비스 : IServiceContract

{

     공용 문자열 GetMessage ()

     {

          return "Hello World!";

     }

}

다중 동시성 모드 : 이 모드에서 서비스는 여러 스레드가 동일한 시점에 서비스 작업에 액세스 할 수 있도록합니다. 다중 동시성 작동 모드에서 각 WCF 서비스에는 들어오는 요청을 동시에 처리 할 수있는 다중 스레드가 있습니다.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

public class Service : IServiceContract

{

    readonly object lockObj = new object();

    public string GetMessage()

    {

        string message = string.Empty;

        lock (lockObj)

        {

             message = "Hello World!";

        }

        return message;

    }

}

재진입 동시성 모드 : 재진입 작동 모드에서는 단일 스레드가 서비스 개체에 액세스 할 수 있지만 스레드는 여전히 서비스를 종료 한 다음 다른 서비스를 호출 할 수 있습니다. 다음 코드 스 니펫은이 모드를 구현하는 방법을 보여줍니다.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

InstanceContextMode 속성은 서비스 인스턴스가 생성되는시기와 내구성을 지정하는 데 사용됩니다. InstanceContextMode와 ConcurrencyMode는 모두 ServiceBehaviorAttribute를 사용하여 지정됩니다. 사용 가능한 세 가지 인스턴스 컨텍스트 모드 값은 PerCall, PerSession 및 Single입니다. PerCall 모드에서 서비스는 단일 스레드이며 상태 비 저장입니다. PerSession 모드는 기본값이며 동일한 서비스 소비자에서 시작된 호출간에 상태 정보를 유지하려는 경우 사용됩니다. 단일 모드는 서비스가 클라이언트간에 상태 정보를 유지해야하고 향후 서비스를 확장 할 필요가 없을 때 사용됩니다.

조절

제한을 활용하여 리소스 사용을 제어 및 최적화하고 서비스 성능의 균형을 맞추는 방법을 얻을 수 있습니다. WCF의 제한은 프로그래밍 방식뿐만 아니라 선언적으로도 구성 할 수 있습니다.

아래 코드 스 니펫에 표시된대로 서비스 구성 파일의 태그를 사용하여 선언적으로 maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions 속성을 구성 할 수 있습니다.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                maxConcurrentInstances

                                maxConcurrentSessions/>

       

     

   

The maxConcurrentCalls property is used to limit the total number of calls across all the service instances. The default value is 16 per processor. The maxConcurrentInstances property is used to specify the total number of service instances that can be allocated at a particular point of time. The default value of this property is Int32.MaxValue. The maxConcurrentSessions property is used to specify the total number of concurrent active sessions that is permissible for a service at a given point of time. The default value is 100 per processor.

Now that we know how to configure service throttling in WCF declaratively, let’s explore how we can configure service throttling in WCF programmatically. To configure service throttling in WCF programmatically, you would need to take advantage of the ServiceThrottlingBehavior class. The following code listing shows how you can take advantage of the ServiceThrottlingBehavior class to configure the concurrent calls, session and instance properties.

ServiceHost serviceHost = new ServiceHost(typeof(Service));

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

            if (throttleBehavior == null)

            {

                throttleBehavior = new ServiceThrottlingBehavior();

                throttleBehavior.MaxConcurrentCalls = 1000;

                throttleBehavior.MaxConcurrentSessions = 250;

                throttleBehavior.MaxConcurrentInstances = 500;

              serviceHost.Description.Behaviors.Add(throttleBehavior);

            }

In the above code snippet, an instance of ServiceThrottlingBehavior is created and its properties set to the appropriate values. Next, this instance is added to the Behaviors collection of the service host instance.