2012-07-04 31 views
5

新しいクライアントごとに新しいサービスインスタンスを作成するように構成されたWCFデュプレックスサービス(NetTcpBinding)(pattern publish-subscribeを参照)を使用すると、各サービスインスタンスに対して特定のコールバックインスタンスを取得できます。異なるインスタンスが作成されるため、異なるコールバックに属するメソッドを異なるスレッドから同時に呼び出すことができます。WCFコールバック、プロキシおよびスレッドセーフ

  • 複数のスレッドが同じコールバックで同じメソッドを呼び出そうとするとどうなりますか?
  • 同じコールバックに対して異なるメソッドを呼び出そうとするとどうなりますか?
  • 複数のスレッドからこれらのメソッドへの同時アクセスを管理する必要がありますか?両方の場合において?

サービスと通信するクライアント側を考えてみましょう:クライアントがサービスを使用できることを確認するには、新しいプロキシをインスタンス化する必要があります。サービスに定義されたメソッドを呼び出すには、プロキシの対応するメソッド。

  • 複数のスレッドが同じプロキシインスタンスで同じメソッドを呼び出そうとするとどうなりますか?
  • 同じプロキシインスタンスに対して異なるメソッドを呼び出そうとするとどうなりますか?
  • 複数のスレッドからこれらのメソッドへの同時アクセスを管理する必要がありますか?両方の場合において?
+1

本当に質問です。より多くのことを学ぶことができます。あなたは実際に物を探検するためのテストの負荷を書くべきです。とにかくそれをやらなければならないのであれば答えが返ってくるだろう。 –

答えて

6

これらの質問のほとんどの回答は、サービスの並行性をどのように管理するかによって異なります。あなたがConcurrencyModeInstanceContextModeのために設定したものに依存するため、決定的な答えはありません。 WCFの同時実行管理により、サービスのスレッドの振る舞いやパフォーマンスを微調整することができます。長くて厄介な(しかし非常に詳細な)読みはconcurrency management is available on MSDNです。

InstanceContextModeでは、サービスのインスタンス化方法を定義できます。大量の作業を大量に実行し、多くの呼び出しを処理するサービスでは、一般的な考え方は、この設定と同様にインスタンス化することです。着信するクライアント要求は、その度にサービスの別のインスタンスで処理されます。

ConcurrencyMode(メインプレイヤー)は、指定された時間にサービスインスタンスにアクセスできるスレッドの数を定義します。 ConcurrencyMode=Singleでは、一度に1つのスレッドだけがサービスインスタンスにアクセスできます。これは、SynchronizationConextを有効にしたかどうかによっても異なります。SynchronizationConext=trueの場合、サービスが別の要求に応答している場合は、クライアントの呼び出しがキューに入れられます。したがって、着信サービスコールは、前のコールが最初に処理されるまでキューに入れられます。 ConcurrencyMode=Multiple設定では、任意の数のスレッドがサービスインスタンスへのアクセスを許可されます。つまり、スレッドプール内で使用可能なスレッド数(CPUパワーに直接関係している)を考えれば、複数の並行処理モードを持つキャッチは、デフォルトではSynchronizationContextがfalseに設定されるため、状態が管理されないため、サービスが多くの信頼性がないため、呼び出しを受信して​​応答する順序が異なります。​​の素敵な短い要約。

これらの設定は、でホスティングするときになるだろうタイミングの、おそらくあまりにも代表をInstanceContextモードと組み合わせて使用​​する場合、あなたのサービスのパフォーマンスに影響を与え、結果だけで自己ホスト環境であると思われるものの(this pretty nice article which explores various concurrency modes and instance context settings and their effects on performanceが表示されますIIS)。

サービスの並行性を管理する方法は、パフォーマンスに大きく影響します。理想的には、可能な限り多くのスレッドを利用可能にしたい(ThreadPoolの最小スレッドを増やして)サービスにし、サービスが処理資源を持つ限り、着信サービス呼び出しがキューに入れられないようにしたい。しかし、マルチスレッドを過剰に使用すると、状態管理とクライアント要求に応答する順序が犠牲になります。

関連する問題