2011-01-15 7 views
5

こんにちは、私はWCFで安らかなサービスを作成していますが、いつでも少なくとも500人がこのサービスを利用する可能性があります。これに対処するために設定する必要のある設定。私にポイントとヒントをくれて、ありがとう。WCFの作成快適なサービス、並行性の問題

ここに私がこれまで持っていたもののサンプルがあります。

[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

これは呼び出されているメソッドの例です。

public UsersAPI getUserInfo(string UserID) 
    { 
     UsersAPI users = new UsersAPI(int.Parse(UserID)); 

     return users; 
    } 



    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "User/{UserID}")] 
    [WebHelp(Comment = "This returns a users info.")] 
    UsersAPI getUserInfo(string UserID); 

答えて

7

最善のアプローチは、使用するために次のようになります。

  • InstanceContextMode.PerCall
  • ConcurrencyMode.Single

これは、各呼び出し元に対するサービスクラスの新しいインスタンスを作成し、必要がなくなりますそれぞれの要求が独自のサービスクラスインスタンスを取得するため、コードへのマルチスレッド同時アクセスを心配する必要があります(それ自体はシングルスレッドです - 一度に1人の発信者にしか対応しません)。

また、このアプローチでは、簡単に「スケールアウト」することができます。より多くの負荷を処理するサーバー(場所のサーバー、またはWindows Azureワーカーなどの「クラウド内」)を追加するだけです。

ServiceThrottlingサービスの動作を使用すると、同時呼び出し可能な発信者の数を非常に簡単に制御できます。これは、お使いのマシンのタイプとサイズによって異なります。

<serviceBehaviors> 
    <behavior name="Throttling"> 
    <serviceThrottling 
      maxConcurrentCalls="16" 
      maxConcurrentInstances="16" 
      maxConcurrentSessions="10" /> 
    </behavior> 
</serviceBehaviors> 

者はWCF 3.5のデフォルトです - maxConcurrentCalls設定を同時に処理することができますどのように多くの発信者を定義します。

詳しくはMSDN docs on Service throttlingをご覧ください。

+0

返信いただきありがとうございます。私たちが大きく成長し、30000ユーザーのようなものがあった場合、同じ設定が適用されますか? – pmillio

+0

+1、良い答え。上記の設定では、サービスインスタンスの外部で共有状態にアクセスする場合、スレッドの安全性についても心配する必要があります。また、サービスインスタンスに可変状態を格納しない場合は、最高のパフォーマンスを得るために 'InstanceContextMode.Single'と' ConcurrencyMode.Multiple'を使用することができます。 –

+1

@pmillio:maxConcurrentCallsの数を増やす必要があるかもしれません(それはちょうどデフォルトです)、またはサーバーを追加購入する必要があるかもしれませんが、アーキテクチャは非常にスケールされます。 –

関連する問題