3

スレッドセーフではない管理されていないライブラリを呼び出す IIS でホストされている WCF サービスがあります。

プロセスのプールを保持し、プロセスごとに 1 つの要求のみを割り当てるように、何らかの方法で IIS をセットアップする必要があります。

どうすればいいですか?

スレッドの安全性の説明: アンマネージ ライブラリには、操作の開始時にゼロに設定されたプロセス全体の共有静的配列が含まれており、操作中にゆっくりと (30 秒から 3 分) 結果が入力され、最終結果が返されます。呼び出しは CPU 集中型ではなく、データは外部ソースから収集されます。順次呼び出しを行うことは安全ですが、並列呼び出しを行うと配列内のデータが破損し、両方の呼び出しが間違った結果を返します。私はこのライブラリを制御できません。

30 ~ 100 件のリクエストを並行して処理できる必要があります。

4

2 に答える 2

2

プロセスごとのリソースが1つしかないため、これを自動的に行う方法がわからないため、プロセスを手動で起動する必要があります。WCFを使用して、プロセス間通信を実行したり、すべてのプロセスに対して単一の公開エントリポイントを設定したりすることもできます。

リクエストを受け入れ、ワーカープロセスを起動し、データを送信して完了するのを待ってから、データを受信して​​元のリクエスターに転送する1つのスーパーバイザーサービスが必要です。各ワーカープロセスは、ServiceHostクラスを使用してWCFサーバーをホストできます(非常に簡単に使用できます)。結果が返されたときにワーカープロセスを終了させるか、独自のプーリングを実行することができます。プールする場合は、ワーカーコントラクトに2つのメソッドがあります:DoWorkShutdown。各ワーカーのDoWorkをシリアルに呼び出すか、次の属性をワーカーサービスクラスに適用することで、WCF自体に同時リクエストをブロックさせることができます。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
                 ConcurrencyMode = ConcurrencyMode.Single)]

これにより、単一のワーカープロセスで2つの並列操作を実行しようとすると、リクエストがブロックされてキューに入れられます。そのため、ラウンドロビン方式ですべてのワーカースレッドを呼び出すだけで、ピーク負荷を超えて処理してキューに入れることができます。処理能力。

上司は、単純なクライアント向けの契約を結び、作業を労働者のプロセスに単純に任せます。ワーカーをプールしている場合は、負荷が減少して不要になったときに一部のワーカーをシャットダウンできます(必要な場合)。スーパーバイザーは、WCFの非同期パターンを使用して、各要求がスレッドをブロックして拘束する代わりに、実質的にリソースを使用しないようにすることができます(実際には何の作業も行わないため)。Task<T>WCF非同期の場合、.NET 4.0以下でWCFに必要な非同期フープをジャンプするよりも、実装がはるかに簡単であるため(単に、を返す)、.NET4.5を使用することをお勧めします。

肝心なのは、あなたの奇妙な制約のために、あなたはあなたの望ましい目標を達成するために少し足の仕事をしなければならないということです。それでも、ほとんどの配管はWCFで処理できます。

于 2012-12-31T09:12:38.977 に答える
0

ServiceThrotttlingBehaviorを使用してプロセスのプールを構成し、同時実行モードを使用して、サービスクラスがシングルスレッドまたはマルチスレッドのどちらの操作モードをサポートするかを指定できます。

インスタンスコンテキストモードは、着信メッセージに含まれるコールの処理に使用できるサービスインスタンスの数を指定します。

あなたの場合、
1。はまたConcurrencyModeはである必要がありConcurrencyMode.SingleますConcurrencyMode.Reentrant
2.またはInstanceContextModeである必要があります。 PerCallPerSession

セッション、インスタンス化、および同時実行

WCFの同時実行性(単一、複数、および再入可能)とスロットリング

于 2012-12-31T03:09:48.610 に答える