2009-05-04 4 views
9

私はネットワークサーバーを構築しており、要求がルーティングされるサーバー上で多くのAppDomainsを開始しています。処理ペイロードをAppDomainの1つに送信する最も速い方法は何でしょうか?同じプロセス内のAppDomains間に大きなバイト配列を送信します。

  1. ソケットからのペイロードをバイト配列に読み込み、整列化します。
  2. ネットワークストリーム(MarshalByRefから継承)をAppDomainにマーシャリングします。
  3. ペイロードを読み取ります。オブジェクトにデコードします。デコードされたオブジェクトをマーシャリングします。
  4. 名前付きパイプを使用してバイト配列を転送します。
  5. ループバックソケットを使用します。
  6. 多分、実際のソケット接続をマーシャリングする方法がありますか?

復号がほとんど要求し、アプリケーションドメインは、再度ソケットを介して送り返し、ホストアプリケーションドメインに対応し、マーシャルを作成するクライアントを満たす方法を決定するために使用される不変オブジェクトを作成します。

この方法では、CPUより少ないメモリを使用することをお勧めします。

WCFはオプションではありません。

答えて

1

TCPバイナリリモート処理は確かに速いですが、おそらく最も速いローソケットではなく、ロイヤルPIAよりもはるかに速くはありません。

私は、2つのボックス間のHTTPバイナリリモーティングを使用して、プロダクションで1500〜2000reqを毎秒実行しました。同じボックスでは、データを処理するために必要なCPUサイクルに応じて、TCPまたはネームパイプチャネルを使用して、はるかに高いパフォーマンスが得られます。

1

私があなただったら、Cassiniの実装方法を見てみましょう。あなたがやっていることについて話しているのとほとんど同じです。

実際には、CassiniはVisual Studioに付属している組み込みのWebサーバーであるWebhostに取って代わられています。 Phil Haackのブログでthis postをご覧ください。

+0

CassiniはリモートAppDomainの接続をリッスンします。 OPは、デフォルトのAppDomain上のソケットでリッスンしたいと思うようです。 –

1

非常に良い質問です。私がこの問題に遭遇したのであれば、おそらくBuffered Stream/Memory Streamを使用してストリームをマーシャリングしてAppDomainにマーシャリングしたり、異なるAppDomainで作成された多くのオブジェクトグラフのマーシャリングやシリアル化を減らすためにオブジェクトを消費します。

しかし、IISの機能をほぼ完全に複製しているように聞こえるので、System.Web.Hosting名前空間を見て、どのように処理しているかを見てみましょう。

1

6。 実際のソケット接続をマーシャリングする方法がありますか?

6thはIMOが最適です。 プロセスの観点からのソケットは単なるハンドルです。 AppDomainsは単一プロセスに存在します。つまり、appdomainはソケットハンドルを交換できます。

ソケットマーシャリングが機能しない場合は、他のappdomainでソケットを再作成することができます。これを行うにはDuplicateAndCloseを使用できます。

これでうまくいかない場合は、最適なデータ転送方法を選択するためのパフォーマンステストを行う必要があります。 (名前付きパイプまたはmemomryマップファイルを選択します)

関連する問題