0

Windows サービスでホストされている単純な WCF サービスがあります。サービス自体は、完了するまでに 10 秒かかる長いトランザクションをシミュレートするだけです。また、データベースにエントリを記録するためのコードがサービスにあるので、それが呼び出されていること、操作が完了していることなどがわかります。サービス構成の概要は次のとおりです。

  1. バインディング: NetTcpBinding
  2. SessionMode: 許可 (実際には関係ありません)
  3. IsOneWay: 真
  4. InstanceContextMode: シングル
  5. ConcurrencyMode: シングル

次に、サービス メソッドを 4 回連続して呼び出すテスト クライアントを用意します。ログに表示されると予想されるのは、すべてが順次実行され、複数の呼び出しがキューに入れられ、前の呼び出しでサービスが完了したときに処理されることです。

ただし、ログに記録されているのは最初の通話のみで、残りはドロップされていることがわかります。各呼び出しの間に 15 秒のギャップを入れると、すべての呼び出しが処理され、ログに記録されます。あらゆる種類の設定 (inactivityTimeout、listenBackLog など) をいじりましたが、何も役に立ちませんでした。

ここで何が欠けていますか?

4

1 に答える 1

0
  • InstanceContextMode: singleシングルトンを作成します-リクエストを処理できるサービスクラスのインスタンスは1つだけです。

  • ConcurrencyMode: singleつまり、シングルトン サービス クラスは一度に 1 つのリクエストしか処理できません。たとえば、着信リクエストを順次処理します。

これら 2 つの設定を使用することで、適切なボトルネックが作成されました....はい、リクエストは 1 つずつ順番に処理されます。したがって、明らかに、ある時点で、2 番目以降のリクエストはタイムアウトなどに遭遇し、破棄される必要があります。通常、これらのタイムアウトは 1 分に設定されているため、10 秒のトランザクションで問題が発生することはありません....

これらの呼び出しをどのように行うかによって異なります。コードをまったく提供していないため、推測することしかできません。単一の WCF クライアント側プロキシを使用していますか? それとも、本当に 4 つの個別のアプリ インスタンスがあり、それぞれがリクエストを送信しているのでしょうか?

リクエストを送信するクライアント側でエラーや障害が発生していますか?? もしそうなら:どのようなエラーですか?クライアント コードによってセッションが開始されますか?

好奇心から: これは単なる思考実験ですか、それともシステムにそのようなボトルネックを恣意的に作成したい特定の理由がありますか?? 推奨されるベスト プラクティスは、InstanceContextMode=PerCall を設定することです。これにより、これらすべての問題が解決されると確信しています。4 つの要求すべてがサービス クラスの独自のコピーを取得し、同時に処理する必要があります。問題ありません。

于 2011-02-03T21:38:42.480 に答える