以下のテキストは、この質問を拡張して色を追加するための努力です。
不正なクライアントがサービス全体をダウンさせないようにするにはどうすればよいですか?
私は基本的にこのシナリオを持っています: WCF サービスは、クライアント コールバックで稼働しており、単純な一方向通信であり、これとそれほど違いはありません。
public interface IMyClientContract
{
[OperationContract(IsOneWay = true)]
void SomethingChanged(simpleObject myObj);
}
このメソッドを、サービスから最終的には約 50 の同時接続クライアントに対して、1 秒間に何千回も呼び出す可能性があります。レイテンシは可能な限り低くします (15 ミリ秒未満が望ましい)。これは、サーバーに接続されているクライアント アプリの1 つにブレーク ポイントを設定するまで正常に動作し、サービスがハングしてから 2 ~ 5 秒後にすべてがハングし、サービスが終了するまで約 30 秒間、他のクライアントはデータを受信しません。接続障害イベントを登録し、問題のあるクライアントを切断します。この後、他のすべてのクライアントは引き続きメッセージを受信します。
serviceThrottling、同時実行性の調整、スレッドプールの最小スレッドの設定、WCF の秘密のソース、および 9 ヤード全体について調査しましたが、1 日の終わりに、この記事MSDN - WCF の要点、一方向の呼び出し、コールバック、およびイベント について正確に説明しています。実際に推奨せずに私が抱えている問題。
サービスが安全にクライアントにコールバックできるようにする 3 つ目の解決策は、コールバック コントラクト操作を一方向操作として構成することです。そうすることで、同時実行性がシングルスレッドに設定されている場合でも、サービスがコールバックできるようになります。これは、ロックを争う応答メッセージがないためです。
しかし、記事の前半で、クライアントの観点からのみ、私が見ている問題について説明しています
一方向の呼び出しがサービスに到達すると、すべてが一度にディスパッチされず、サービスで構成された同時実行モードの動作とセッション モードに従って、一度に 1 つずつディスパッチされるようにサービス側でキューに入れられる場合があります。サービスがキューに入れるメッセージ (一方向または要求/応答) の数は、構成されたチャネルと信頼性モードの積です。キューに入れられたメッセージの数がキューの容量を超えた場合、一方向の呼び出しを発行しても、クライアントはブロックされます。
クライアントへのキューに入れられたメッセージの数がキューの容量を超えており、スレッドプールがこのクライアントを呼び出そうとするスレッドでいっぱいになり、すべてブロックされているとしか考えられません。
これを処理する正しい方法は何ですか? クライアントごとにサービス通信レイヤーでキューに入れられているメッセージの数を確認し、特定の制限に達した後に接続を中止する方法を調査する必要がありますか?
満杯のキューで WCF サービス自体がブロックされている場合、サービス内に実装できるすべての非同期/一方向/ファイア アンド フォーゲット戦略は、1 つのクライアントのキューがいっぱいになるたびにブロックされます。