2011-11-19 28 views
5

クライアントの要求を受け入れ、内部的にリモートマシンに接続してジョブを実行するWCFサービスを作成する必要があります。リモートマシンは非常に優れた処理能力を備えていますが、処理速度は良くありません。つまり、毎秒1000トランザクションを処理できますが、各トランザクションには1秒かかる可能性があるため、唯一の方法は、1.000同時トランザクションを同じ秒で実行することです。WCF非同期サーバー側の処理

リモートマシンがこの状況を非常にうまく処理していますが、各トランザクションが内部的に(クライアント側のモデル(同期または非同期)に気を配っていない)WCFを心配しています。 2秒で、これは1.000の作業スレッドが生きていることを表しているかもしれません。それは非常に危険かもしれません。あるいは、WCFがスレッドプールを使用して、他の人を待機状態にしてしまいます。

私の質問は、サーバー側で要求を非同期に処理する可能性についてです。だから、トランザクションの流れは次のようにする必要があります

  1. Cliente要求(彼の側で同期要求である)
  2. サーバーは要求をreciveとトランザクションキューにこの要求を入れて、スレッド
  3. を解放する初期化タスクが終了すると、サーバーはHTTP 200と結果をクライアントに送信する要求を完了します。

ありがとう!

+0

IISでwcfサービスを提供している場合は、上記のいずれも行う必要はありません。 IISは要求ごとに個別のスレッドをスプールアップし、wcfの新しいインスタンスをインスタンス化し、要求を処理して結果を返します。既存のスレッドが利用可能な場合、IISは新しいスレッドをスプールする代わりに、そのスレッドを使用します。 – edepperson

+0

スレッド「飽和」の問題を解決できない場合は、再利用スレッドではない非同期処理が必要です –

答えて

1

これを実現するには、WCF非同期パターンを使用できます。 operationContractにasync属性を設定すると、WCFはIO CompletionPortスレッドを使用して要求を処理します。

ですので、次のように動作します。要求はIISのスレッドによって処理され、WCFに到達するとスリープ状態になり、IO CompletionPortスレッドは要求を処理してから、クライアントに応答を返すIISスレッドに応答を返します。

IO CompletionPortスレッドは、はるかに高速であり、パフォーマンスやリソースの点でサーバーの速度を低下させません。

詳細については、linkをご覧ください。中間層サーバーで

+0

しかし、それを行う方法。単純なパラメータでは、データベースからの応答を外部マシンから待っているスレッドを解放することはできません。非同期は開発者によって実装されなければなりません。開発者は非同期完了イベントの後にトランザクションがどのように再開するかを知っています。あなたはIISとWCFの間のスレッドブロックを避けるためにAIMに応答しますが、WCFとデータベースの間ではブロックしません(例えば) –

+0

プロセスが完了するまでスレッドをブロックしたくないということですか?このようなシナリオでは、クライアントが要求を出して忘れてしまうIsOneWayOperationを取ることができます。クライアントが応答を返すようにするには、クライアントがサーバーへのコールバックを指定し、処理が完了したらサーバーはコールバックを実行して状態を更新します。 – Rajesh

+1

私は、async/uswaタスククラスが解決策になるかもしれないことが分かったので、私はこれを調査します。 –

0

、非同期パターンに従って、あなたの操作を宣言し、実装します。

[OperationContract(Action = "DoSomething", AsyncPattern = true)] 
IAsyncResult BeginDoSomething(AsyncCallback asyncCallback, object asyncState); 
void EndDoSomething(IAsyncResult iar); 

BeginDoSomethingの実装では、リモートマシンに要求を送信し、すぐに返す必要があります。 クライアント側でDoSomething()を呼び出すと、中間層のWCFはこの操作が非同期のBegin/Endペアとして実装され、適切に呼び出されることを認識します。

関連する問題