.NET Remoting を使用してオブジェクトをホストするサーバーを実装するときに、SingleCall と Singleton のアクティベーション メソッドの違いを識別しようとしています。SingleCall には、クライアント側の呼び出しごとにオブジェクトを構築してクリーンアップする必要があるというオーバーヘッドがあるように見えますが、Singleton には限られた数の同時リクエストしか処理できないという制限があります。パフォーマンスをできる限り向上させたいと考えています。どちらを選ぶべきですか?
.net - サーバーでアクティブ化されたオブジェクトを使用して .NET Remoting を使用する場合、SingleCall と Singleton のアクティブ化の間のトレードオフは何ですか?
2 に答える
あなたが正しいです。SingleCall は各呼び出しごとにオブジェクトを構築し、複数の同時要求を受け入れることができますが、呼び出し間でデータを共有することはできません。一方、Singleton は単一のオブジェクトを構築して複数の呼び出しを処理し、データ共有を許可しますが、同時接続を制限します。ただし、スレッド セーフなオブジェクトを作成する方法についてある程度の概念がある場合は、微調整を行うことができます。
まず、Singleton を使用することをお勧めします。Singleton は一度だけ作成されるためです。これには、情報を保存し、接続しているユーザー間で情報を共有できるという利点もあります。
次に、ConcurrencyMode=ConcurrencyMode.Multiple をサービスの ServiceBehaviors に追加することを検討します。これにより、複数のユーザーがシングルトンを同時にヒットできます。
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
…
}
3 番目に、このクラスをスレッドセーフにしないコードをクリーンアップします。複数のスレッドが同時にアクセスできるローカル変数にアクセスするときは、オブジェクトをロックする必要があります。
これらのトピックに関する多くの優れた情報は、次の場所にあります。
デフォルトでは、SingleCall を使用する必要があります。
また、SingleCall オブジェクトを使用する場合、呼び出し間で状態を共有できないことに注意してください。
.NET リモート処理に関しては、このサイトが優れたリソースであることがわかりました: http://www.thinktecture.com/resourcearchive/net-remoting-faq/remotingusecases