6

asp.netアプリケーションに多くのシングルトン実装があり、パフォーマンス上の理由から、アプリケーションをIISWebGarden環境に移動したいと考えています。

CMIIW、n個のワーカープロセスを使用してIIS Web Gardenに移動すると、各ワーカープロセスで1つのシングルトンオブジェクトが作成されます。これにより、 n > 1であるため、単一のオブジェクトではなくなります。

これらすべてのシングルトンオブジェクトをIISWebGardenで再びシングルトンにすることはできますか?

4

1 に答える 1

10

私はあなたができるとは思いません(それらのIISワーカーに共有メモリ内のオブジェクトを何らかの方法で使用させることができない限り)。

これはスコープの問題です。シングルトンインスタンスは、スコープとしてプロセススペースを使用します。そして、あなたが言ったように、あなたの実装は今や複数のプロセスにまたがっています。 定義上、ほとんどのオペレーティングシステムでは、シングルトンは単一のクラスインスタンスまたはオブジェクトに関連付けられているため、特定のプロセススペースに関連付けられます。

本当にシングルトンが必要ですか?これは、そのパターンを使用する前に尋ねる非常に重要な質問です。ウィキペディアが言うように、それをアンチパターン(またはコードの臭いなど)と考える人もいます。

動作する可能性のある代替設計の例には、次のものがあります...

  1. 複数のオブジェクトを中央ストアに対して、または相互に同期させることができます。
  2. 該当する場合は、オブジェクトのシリアル化を使用します。
  3. Windowsサービスと何らかの形式のIPCを使用します。System.Runtime.Remoting.Channels.Ipc

大規模なWebサイトのオプション3が好きです。コンパニオンWindowsサービスは、一般的に大規模なWebサイトで非常に役立ちます。メールの送信やバッチジョブなどの多くのものは、フロントエンドの処理ワーカープロセスからすでに切り離されている必要があります。シングルトンサーバーオブジェクトをそのプロセスにプッシュし、IISワーカープロセスでクライアントオブジェクトを使用できます。

シングルトンクラスが状態を共有する、または初期状態を共有するだけの複数のオブジェクトで機能する場合は、オプション1と2がそれぞれ機能するはずです。

編集

あなたのコメントから、分散キャッシュの形の最初のオプションがあなたのために働くはずだと思われます。

そこには多くの分散キャッシュの実装があります。

  1. Microsoft AppFabric(以前はVelocityと呼ばれていました)は、この分野へのごく最近の動きです。
  2. MemcachedASP.Netプロバイダー
  3. NCacheMSDN Article)-OutProcサポートのカスタムASP.Netキャッシュプロバイダー。そこに他のカスタムキャッシュプロバイダーがあるはずです。
  4. WindowsサービスとIPCを使用して独自の分散キャッシュを展開する(オプション3)

PS。あなたは特にチ​​ャットを調べているので。CometASP.NETのComet実装?WebSyncなど)を調査することを強くお勧めします

于 2010-06-04T14:07:59.333 に答える