2012-02-03 20 views
8

デュプレックス非同期コールのパフォーマンス上の利点を否定することはできませんが、いくつかの点では気になります。WCFデュプレックスクライアントのベストプラクティス

クライアントオブジェクトがインスタンス化されていると、WCFは特定のクライアントサービスインスタンスがコールバック引数を受け取るように指示できますか?

これはいい考えですか?なぜそうでないのであれば?

new DuplexChannelFactory<IServerWithCallback>(
    new ClientService(), 
    new NetTcpBinding(), 
    new EndpointAddress("net.tcp://localhost:1234/"+Guid.NewGuid())) 
  1. 上記の仮想パスは、それを破棄することができますどのように予約されている場合。私はクライアントサービスの寿命をかなり短くしたい。 IEは要求を出して応答を受け取り、受け取ったらそれを殺す。クライアントサービスのライフタイムを短くすることでパフォーマンスを低下させ、プーリングしてより長く生き続けることが難しい。

    タイムアウトの問題を避けることです。完了したら、ASAPを受信、送信、廃棄します。コンベンションでは、クライアントサービスを渡すことはできません。情報が必要な場合は、EF/L2Sなどと同じように簡単に新しいものを作成してください。

  2. クライアントからセッションを削除するにはどうすればいいですか?すなわち、クライアントがセッションを終了しないようにしたい - 私はそれに応じて私の操作を飾ることができると知っているが、特定の条件が満たされたときにサービスがプログラム的に終了するようにしたい。

  3. ファイアウォールの問題を解決するためにポートとフォワードを貼り付けることができますが、クライアントがロードバランサの背後に座っていれば心配です。サービスは、どの特定のサーバーを呼び出すのかをどのように知っていますか?

答えて

7

私は最終的にはデュプレックスサービスはMicrosoftのもう一つの失敗したアーキテクチャだと思います。これは、紙の上で実際に見栄えが良いものの、詳細な検討の結果、崩れ落ちるものの1つです。サーバがクライアントのリスナーを確立するセッションの

1)リライアンス:

は、あまりにも多くの弱点があります。これは、セッション情報がメモリに保存されていることを示します。したがって、サーバー自体の負荷分散はできません。または、負荷分散されている場合は、IPアフィニティをオンにする必要がありますが、サーバーの1つが攻撃された場合、別のサーバーを追加して、これらのセッションが自動的に新しいサーバーに移行することはできません。

2)ルータ/ファイアウォール/ロードバランサの背後にあるクライアントごとに、特定のポートを持つ新しいエンドポイントを作成する必要があります。そうしないと、ルータはコールバックメッセージを適切なクライアントに適切にルーティングできなくなります。別の方法として、特定のサーバーに特定のパスをリダイレクトするカスタムプログラミングを可能にするルーターを用意することです。再び高価な注文。または、別の方法は、コールバックを持つクライアントがデータベースをホストし、データベースを介してデータを共有することです。< - ライセンス料が問題にならない状況でも動作する可能性があります...しかし、クライアントとそれに加えてアプリケーション層とサービス層を混在させます(例外的な状況では受け入れられるかもしれませんが、巨大な設定コストの上では受け入れられないかもしれません)3)すべてこれは基本的に二重が実用上役に立たないと言います。コールバックが必要な場合は、クライアント側でwcfホストをセットアップすることができます。よりシンプルでスケーラビリティに優れています。さらに、クライアントとサーバーの結合も少なくなります。

スケーラブルアーキテクチャのための最良のデュプレックスソリューションは、最終的には1つを使用しません。

+2

NetTcpBindingまたはデュアルHttpバインディングの場合は、この回答は真ですか? – Yaniv

3
  1. それはあなたが、クライアントがアップnew'd、彼らがいつまで続く必要があるか短いに依存します。毎回新しいクライアントが必要な場合は、プーリングはオプションではありませんが、同じクライアントを再作成すると失敗した場合、クライアントは同じプールを使用しないでください。

  2. 現実には、サービスがクライアントにコールバックしている(実際にはクライアント上の関数を呼び出している)場合、情報を渡すためのサービスがクライアントになり、その逆もあります。あなたはコールバックを行っているサービスを持つことができます。接続を閉じます(ただし、GCがそれを処分できるまで私の経験からは予想以上の時間がかかることがあります)。要するに、クライアントは自分自身をシャットダウンしたり切断したりするために責任を負うべきです(クライアントは何かを呼び出しています)。サービスはクライアントから回答を返すだけです。

  3. デュプレックスコールバックでは、現在クライアントにコールバックするサービスは、duplexchannelfactoryの背後で抽象化されたクライアントのアドレスを取得します。サービスがクライアントにコールバックできない場合は、実行できることはあまりないと思うので、クライアントがコールしているポートが、私が推測するコールバックを受け取れるように開いていることを確認する必要があります。

関連する問題