WCFでのインスタンス化、同時実行性、およびスロットルの調査

WCFで作業するときは、インスタンス化、スロットリング、および同時実行の概念を認識して、スケーラブルでスループットを向上できるサービスを構築する必要があります。

WCFのスロットリングは、システムのリソース消費(メモリ、プロセッサ、ディスク、ネットワークなど)が許容レベルになるように、つまりサービスが許容制限を超えてリソースを消費しないように、サービススループットを制限するために使用されます。ServiceThrottlingBehaviorクラスを使用して、WCFサービスのパフォーマンスを制御できます。

並行性

WCFでは、2つ以上のスレッドが同じリソースに同時にアクセスしようとすると、同時実行の問題が発生する可能性があります。 WCFサービスは、一度に1つの要求を処理できることに注意してください。 WCFの同時実行性を使用すると、特定の時点でInstanceContext内の複数のアクティブなスレッドを制御できます。本質的には、複数の同時リクエストを処理できるサービスインスタンスの数を構成するのに役立ちます。同時実行モードの3つの可能なタイプには、次のものがあります。

単一同時実行モード:このモードでは、各インスタンスコンテキストは、特定の時点で要求を処理できる最大1つのスレッドを持つことができます。次のリクエストが到着すると、最初のリクエストが完了するまで待機する必要があります。これには、同期ロックも必要です。次のコードスニペットは、単一同時実行モードの使用方法を示しています。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

パブリッククラスサービス:IServiceContract

{{

     パブリック文字列GetMessage()

     {{

          「HelloWorld!」を返します。

     }

}

複数同時実行モード:このモードでは、サービスにより、複数のスレッドが同じ時点でサービス操作にアクセスできるようになります。複数同時実行モードの操作では、各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を使用して指定されることに注意してください。使用可能な3つのインスタンスコンテキストモード値には、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.