在同一进程中的AppDomain之间发送大字节数组

时间:2009-05-04 03:19:18

标签: c# .net windows networking remoting

我正在构建网络服务器并在请求路由到的服务器上启动大量AppDomain。将请求有效负载发送到其中一个AppDomain进行处理的最快方法是什么?

  1. 将有效负载从套接​​字读入字节数组并编组。
  2. 将网络流(继承自MarshalByRef)编组为AppDomain。
  3. 阅读有效负载。将其解码为对象。元帅解码的对象。
  4. 使用命名管道传输字节数组。
  5. 使用环回套接字。
  6. 也许有办法编组实际的套接字连接?
  7. 解码主要创建用于确定如何满足客户端请求的不可变对象,然后AppDomain创建响应并将其编组回主机AppDomain,后者通过套接字将其发回。

    该方法应该比较少的CPU更喜欢内存。

    WCF不是一种选择。

4 个答案:

答案 0 :(得分:1)

TCP二进制远程处理肯定很快,我不比原始套接字快多少,这可能是最快的,但是皇家PIA。

我在生产中使用两个盒子之间的HTTP二进制远程处理,每秒运行1500 - 2000 req。在同一个盒子上,使用TCP或名称管道通道应该具有很高的性能,具体取决于处理数据所需的CPU周期。

答案 1 :(得分:1)

如果我是你,我会看看Cassini是如何实施的。它完全正是你所说的。

实际上,Cassini已经被Webhost取代了,它现在是Visual Studio附带的内置Web服务器。在Phil Haack的博客上查看this post了解更多信息。

答案 2 :(得分:1)

非常好的问题。如果我遇到这个问题,我可能会使用缓冲流/内存流并将流编组到AppDomain中,该AppDomain使用该对象来减少编组或序列化在不同AppDomain中创建的许多对象图。

但话又说回来,听起来你几乎完全复制了IIS的功能,所以我会把它看起来/反射到System.Web.Hosting命名空间,看看它们是如何处理它以及它们的WorkerThreadPool等......

答案 3 :(得分:1)

  

6.也许还有办法整理   实际的套接字连接?

第6次是IMO最好的选择。 从进程角度看套接字只是一个句柄。 AppDomains位于单个进程中。这意味着appdomains可以互换套接字句柄。

如果套接字编组不起作用,您可以尝试在其他appdomain中重新创建套接字。您可以使用DuplicateAndClose执行此操作。

如果这不起作用,您应该进行一些性能测试以选择最佳的数据传输方法。 (我会选择命名管道或memomry映射文件)