6

PerSessionとPerCallのどちらを使用するかを決定するための一般的な経験則は何ですか?

私は少し重い(私は思う..)WCFサービスを持っており、約80のテーブルへのCRUDメソッドを含んでいます。

WCFサービスを1つのサービス内の7つの契約(つまり、1つのサービス内の7つのエンドポイント)に分割し、各契約が独自のドメインを処理するようにしました。たとえば、販売契約があるため、すべての販売関連テーブルと対応する操作は、販売の「制限されたコンテキスト」内にあります

したがって、私のWCFサービス構造は次のようになります。

public partial class ABCService : ISalesService
{
   //CRUD methods of all tables related to Sales
}

public partial class ABCService : IMarketingService
{
    //CRUD methods of all tables related to Marketing
}

public partial class ABCService : ICustomerService
{
    //CRUD methods of all tables related to Customer
}

public partial class ABCService : IProductService
{
    //CRUD methods of all tables related to Products
}

PerCallに関する私の懸念は、かなり大規模なDB / WCFサービスを使用しているため、各呼び出しで消費されるリソースの量に、ユーザー数とサービスを呼び出す速度を掛けたものになるのではないかということです。大きすぎます。

詳細はわかりませんが、チャネルプロキシの作成にはコストがかかることを読みました。

ああ、私はVSのサービス参照の追加の代わりに手書きのプロキシを使用してWCFサービスを利用しています。

だから、私の質問は、どちらを使うべきですか?PerSessionまたはPerCall?

アップデート:

  1. 呼び出しの間に状態を維持する必要はありません。
  2. NetTCPバインディングを使用しています
4

2 に答える 2

19

私の意見では、決定を下すには、これら2つの点を考慮してください

  1. 使用するInstanceContextMode.PerSession場合-ユーザーがサーバー上のWCFサービスにいくつかのセッション値を保存している場合。
  2. 使用するInstanceContextMode.PerCall場合-サーバー上のWCFサービスのセッションにユーザーが何も保存していない場合、つまりWCFサービスでは、メモリに保存するためにユーザーごとの設定は必要ありません。スケーラビリティが必要です。

いつ、なぜ、、に関するいくつかのポイント

InstanceContextMode.PerCall

  • サービスがステートレスでスケーラブルである場合、つまり、メリットはステートレスであるためHTTPと同様です。
  • サービスに軽量の初期化コードがある場合(またはまったくない場合)。
  • サービスがシングルスレッドの場合。
  • シナリオ例:ある状況で特定の期間に1000のクライアント要求がある場合、100のアクティブな呼び出しPerCallに対して100のオブジェクトのみがインスタンス化されます。次に、サーバーがクラッシュした場合、発生するエラーは、進行中の100個の実際の要求に対するものだけです(高速フェイルオーバーを想定)。他の900のクライアントは、次の呼び出しで別のサーバーにルーティングできます。PerCall

InstanceContextMode.PerSession

  • サービスが同じクライアントからの呼び出し間で何らかの状態を維持する必要がある場合。
  • サービスに軽量の初期化コードがある場合(またはまったくない場合)。クライアントプロキシごとに新しいインスタンスを取得するだけですが、コンストラクターに高価な初期化コードがあることに注意する必要があります。
  • シナリオ例:ある状況での特定の期間内の1000のクライアント要求に対して、サーバー上で1000のオブジェクトがインスタンス化されている場合がありますが、実際に呼び出しでアクティブPerSessionになっているのは常に100のみです。したがって、インスタンス化されたオブジェクトはリソースの浪費になる可能性があり、負荷がかかった状態でリクエストを処理する機能に影響を与える可能性があります。次に、サーバーがクラッシュした場合、そのサーバーでセッションを実行している1000のクライアントすべてで、セッションが失われ、作業を完了できなくなります。PerSessionPerSession

参照リンク:

  1. MSDN-WCFのインスタンス化、同時実行、およびスロットリング
  2. SO-通話ごととセッションごと
  3. MSDN-WCFコンテキストでのセッションの使用
于 2013-02-27T06:24:37.203 に答える
1

この種の質問に対する答えがオンラインであまり見られない理由は、それが状況によって異なるためです。私がやろうとしていることは、それを試してみることです。次に、サービスをホストしているサーバーでperfmonを開き、サービスのカウンターを追加します。慣れていない場合は、グーグルwcfパフォーマンスマネージャーカウンターを使用してください。

良いニュースは、WCFによってセットアップの変更が非常に簡単になることです。

クライアント側でプロキシをインスタンス化するコストが心配な場合は、perCallはクライアントの動作ではなくサービスの動作であることに注意してください。サービスインスタンスコンテキストをPerCallに設定した場合でも、プロキシのインスタンスを1つ作成し、そのプロキシから一連のメソッド呼び出しを行うことができます。すべてのperCallは、呼び出しを行うと、サービスのインスタンスが作成され、メソッドが呼び出され、サービスのインスタンスが再び破棄されることを意味します。サービスインスタンスに高価な初期化がない場合(つまり、基本的に静的メソッドである場合)、呼び出しごとに問題がない可能性があります。

于 2013-02-27T05:55:31.593 に答える