每个实例的AppDomain还是进程?

时间:2011-02-16 15:47:49

标签: c# .net tcp appdomain

我想知道是否应该使用每个实例的流程,或者是否应该使用AppDomain在单个流程中运行多个实例。

我有一个服务器应用程序遵循类似telnet的设计类型。用户始终通过TCP连接,服务器保持工作站上显示的客户端会话的完整状态。

该软件需要支持最多至少500个并发连接,可能更多。典型的安装需要连续运行3到7个应用程序实例,尽管除了一个实例之外只有几个连接(它们用于测试,参考环境等)。在内部,出于开发目的,每个环境最多有40个环境,最多20个并发连接。我的目标主机环境将是64位Windows。

我知道IIS使用的模型只有一个进程和多个AppDomain,但我也看到每个实例都有一个进程的优势。

我应该使用哪个以及为什么?

修改
不同的实例涉及同一应用程序的不同版本,这些版本不能同时在单个AppDomain中运行。此外,不同的实例不必相互通信,只能与主服务进行通信以进行管理。

3 个答案:

答案 0 :(得分:4)

总结一下:

  1. 您有一个类似服务器的telnet。
  2. 您将在同一台计算机上运行此应用程序的多个版本。
  3. 不同的实例不需要相互通信;只有共同的服务。
  4. 据推测,每个实例都通过不同的端口进行通信

    根据这些要求,我永远不会考虑构建与IIS相同的功能。而是我将它们作为完全独立的应用程序运行。

    顺便说一下,你说错了,说明IIS只有1个进程有多个应用程序域。 IIS可以为单个站点启动多个进程。这称为Web Garden。此外,IIS为其拥有的每个应用程序池至少启动一个进程。您可以在IIS服务器上执行单独的w3wp.exe进程。

    通过公共流程运行所有内容的唯一好处是,主机提供了一切对所有内容都有用的价值。例如,日志记录界面或故障处理。这对于编写,设置和维护来说非常复杂,但收效甚微。

    最后,用户数量并不重要,因为它将受应用程序资源使用的控制。这可能意味着网络,内存甚至磁盘,具体取决于您的应用程序执行的功能。

答案 1 :(得分:2)

好吧,由于您计划了500个这样的会话,因此您无法按用户会话进行处理。 500 appdomains也是如此。 IIS在主机进程(应用程序池)下使用每个应用程序的应用程序域,而不是用户会话。

我可能会使用类似的设计吗? 应用程序域中的每个实例(你说最多40个instacse?) 每个用户都由线程处理,没有新的应用程序域/进程creaeted。(不会像指出的那样) 为了支持大量用户,可以使用负载均衡器指向一组机器

答案 2 :(得分:1)

构建服务器非常容易,以便您以后可以做出决定,并且更有可能有一点混合;一些共享托管与多个应用程序域和一些单一托管?

复杂的位不会创建多个应用程序域并多次运行同一个应用程序。复杂的位置已经到了可以创建单个应用程序域并托管单个应用程序的程度。一旦你能做到这一点,使用相同或不同的应用程序扩展到多个应用程序域很容易。

我有一个示例服务器(here)作为我的server framework的一部分提供,它可以以两种方式运行,它在一个端口上托管一个应用程序域并为每个用户应用程序域提升一个空间在第二个端口上(我不是建议每个用户应用程序域是你需要的,只是它在每个服务器的单个应用程序域的规模的另一端)。

还有一个新的例子可以完成IIS所做的整个“影子复制,自动重启”的事情,这有点复杂,但我已经写了herehere。一旦你有了基本的托管服务,这一点也不会太复杂。

就我个人而言,我倾向于将所有这些构建到服务中,然后simply run multiple copies如果你想要多个服务器然后你可以根据需要混合搭配,并且整个系统的概要分析建议你应该这样做。

我想,总而言之,我会说你应该针对多个应用领域的情况进行设计,因为你总是可以通过使用单个应用程序域配置服务器来运行单个应用程序域和多个进程...