2011-01-22 27 views
3

私はWCFを使用してAPIを作成しています。私の質問は2つの別々のものに分解されますWCF最適なパフォーマンス設定

1)私は、顧客、製品、注文、従業員に関するコールを持っています。

このすべてが1パブリックインタフェースクラス例えば

public interface IRestService 
public class RestService : IRestService 

または私はあなたがなるAPIを使用している場合は、それぞれに1つずつ)が

public interface ICustomer 
public class Customer : ICustomer 

public interface IProducts 
public class Products: IProducts 

2などを呼び出す必要がありますに行くべき私の質問があります何万人ものユーザーと何千ものユーザーが同時にアクセスしますが、どのように設定すればよいでしょうか。 InstanceContextMode、またはConcurrencyModeにはどのような設定を指定しますか。最後にどのようなタイプのバインディングであろうと、ウェブサイトや携帯電話がapiにアクセスできることを念頭に置きましょう。

答えて

1

に変更されていますが、将来的に別々の実装にそれらを分割するオプションを持っているので、私は別々のインターフェースにAPIを破るだろう。

public class RestService : ICustomer, IProducts, IOrders 

しかし、あなたはおそらく、とにかくそれらを別々の実装したいと思いますかのように聞こえる:あなたはまだこのように、すべてのインタフェースを実装するだけで一つのサービスクラスを持つことができます。

並行性の設定に関しては、各呼び出しでどのリソースを使用する必要があるかを自問してください。あなたのサービスクラスのコンストラクタが長時間起動せずに記述できる場合は、PerCallを使用してください。高価なリソースを初期化する必要がある場合は、ConcurrencytMode.Multipleを使用してInstanceContextMode.Singleを推奨し、スレッドセーフなコードを作成してください。例:使用する前に、クラスのプロパティや他の共有リソースでlock()を行ってください。

ではなく、は「高価な初期化」とカウントされますが、ADOは接続プーリングを行い、そのオーバーヘッドを排除するためです。

スロットリングの設定は、Ladislavの記述のとおり、テストによって明らかになります。サービスをストレステストし、その結果を使用して、予想される負荷を処理するために必要なマシンの数を知りたいとします。次に、ラウンドロビンまたは各サーバーの正常性をチェックするものとして要求をルーティングする専用のロードバランサが必要です。ロードバランサは、 "systemhealth.asp"ページを取得し、結果を確認するように設定できます。 「OK」を返すと、そのマシンはプール内に留まります。タイムアウトするか、他のステータスを返した場合は、一時的にプールから削除することができます。

バインディングは、RESTの場合はWebHTTPBindingである必要があります。 BasicHTTPBindingはSOAPインタフェース用であり、例えば[WebGet]をサポートしていません。

RESTサービスである必要がない場合は、NetTcpBindingを使用してさらにパフォーマンスを得ることができます。

+0

お返事ありがとうございます。どこにインターフェイスに関連するメソッドを置くか、彼らは "RestService"クラスに入るでしょう。たとえば、getCustomersByIDは顧客クラスに入りますか? – pmillio

+0

はい、それぞれの責任(顧客、製品、注文)を別々のクラスに分割したい場合は、それぞれのインターフェイス(ICustomer、IProducts、IOrders)を定義し、それぞれを実装する3つのクラスを作成するだけです彼らのそれぞれの方法で。 3つのクラスを1つのクラスにまとめる唯一の理由は、メソッドがほとんどなく、何らかの状態を共有していて、単純なままにしたい場合です。彼らにはたくさんの方法があるなら、それらを分解するのは間違いなく良い考えです。 –

+0

おかげさまでもう一度OK、私は別のクラスごとにインターフェイスとクラスを作成した後、ただ1つのサービスからそれらを呼び出す方法を知りたいと思います。 – pmillio

1
  1. 実際に操作がほとんどない場合は、1つのサービスを使用できます。一般に、サービスは関連する操作の論理的な集まりですが、操作の数は制限されます。通常、サービスの操作が20を超える場合は、リファクタリングについて考える必要があります。

  2. RESTサービスを使用する予定ですか?私はあなたの最初のインターフェイスの例のためにあなたが行うと思います。このような場合、デフォルトのInstanceContextModePerCall)とConcurrencyModeSingle)の値を持つWebHttpBinding(または同様のカスタムバインド)が必要です。他の意味のあるRESTサービスの組み合わせはInstanceContextMode.SingleConcurrencyMode.Multipleですが、サービスの実装に影響を与えるシングルトンとしてサービスを作成します。私の経験則:あなたが本当に必要でない限り、シングルトンサービスを使用しないでください。

  3. 調整の構成は、サービスの実装とサーバーのパフォーマンスに依存します。何千人もの同時ユーザーがあなたにとって本当に意味することは何ですか?何千もの要求を同時に処理するには、Azure(クラウド)でロードバランサまたはホスティングを備えた優れたサーバークラスタが必要です。すべては、処理の速度(操作の実装)とメッセージのサイズにも依存しています。 MaxConcurrentInstancesMaxConcurrentCalls(正確にはPerCallインスタンシングの場合)の設定は、パフォーマンステストによって明らかにする必要があります。サービスの調整のためDefault valuesは良い練習のためにWCF 4.

関連する問題