【问题标题】:WCF Self Hosting PerformanceWCF 自托管性能
【发布时间】:2009-06-20 18:57:27
【问题描述】:

我正在使用 WCF 和 NetTCP 服务编写企业级应用程序。我最初出于好奇选择了 NetTCP,但后来确定它对我来说是最佳选择,因为由于涉及的数据处理量,我可以拥有需要 5 个多小时才能返回结果的调用服务。

我目前生成服务的方式是一个多步骤的过程。我有一个配置部分(使用 System.Configuration),它指定了一些默认内容(端口号、连接客户端的服务器名称、是否启用 HTTP 以及 NetTCP 等),并且在下面有一个“服务”集合它。例如,这是一个基本的样子:

<serverConfiguration tcpListenerPortNumber="60000" httpGetEnabled="true" httpListenerPortNumber="6000" serverName="localhost" retryEnabled="true" retryInterval="5" maxRetryAttempts="3">
    <services>
        <add virtualDirectory="Service1" applicationName="Service1" assembly="SampleService" type="SampleService.Service1" />            
    </services>
</serverConfiguration>

基本上这里发生的事情是我的 Windows 服务启动并查看 集合中的所有内容并为每个服务生成一个线程以加快启动时间,并且每个线程都包含一个 AppDomain 服务真正存在的地方,所以如果一个服务有某种故障不会导致系统停机。

我遇到的“问题”是这个应用程序托管了大约 20 个服务,并且所有服务都需要 15-20 秒才能启动并运行。我做了线程和 AppDomain 部分以将其降低到该值(过去每个服务都按顺序打开时需要一分钟以上),但在我看来,这实际上可以快得多。

有人有什么建议吗? Google Bing 有大量用于托管一项服务的示例,但我在现实世界的应用程序中没有找到太多的示例(遗憾的是,“Hello World”对最终用户没有吸引力)。如果您当前通过 Windows 服务和 NetTCP 托管多个服务,您是如何做到的?

【问题讨论】:

  • 需要比这更快吗?如果它每天只启动一次,那么这就是每天 20 秒。时间不长。
  • 它主要是在调试过程中速度较慢,所以这是我试图挤出性能的主要领域。服务本身将无限期运行(当然要减去重启等)。

标签: wcf multithreading windows-services appdomain nettcpbinding


【解决方案1】:

我终于想通了,毕竟它与 WCF 或我的配置片段无关。当我创建 AppDomain 时,我从另一个项目中窃取了代码,该项目的大小要小得多,并发现创建 AppDomains 的部分使用了 SingleDomain 选项。将其更改为 MultiDomain 使总负载和内存使用量从约 150MB 下降到约 40MB 超过 4 秒。

感谢您的帮助 - 至少它让我再次查看了代码!

【讨论】:

    【解决方案2】:

    我有三个建议:

    首先,如果一个呼叫可能需要 5 个多小时,我会考虑采用排队/回叫式架构。

    考虑将您的服务拆分为 20 个 Windows 服务,每个服务在其自己的 Windows 服务中运行。这会增加复杂性并增加内存使用量,但单个服务可能会更快可用。

    最后,检查服务构造器中的代码是否有任何不需要的代码。

    【讨论】:

    • 20 项服务确实不可行——尤其是从调试的角度来看。我们仍在开发中,我猜我们还有 10-20 项服务尚未建立。从维护的角度来看,此类事情的复杂性很容易超出图表。
    • 为什么这会是一个维护问题,如果所有服务都在同一个框架上创建,使用相同的基础设施、命名约定等。我的意思是相同的日志记录技术、配置等。 40 几乎 -相同的服务不应该比一两个不相同的服务更难维护。
    • 好吧,很多服务相互利用(即调用一个服务可能需要调用其他服务,等等),所以如果你愿意(不是一个真正的终点,但我想你明白我的意思)。更不用说,40 个 Windows 服务似乎有点过分了——特别是如果核心部分发生变化,我必须将这些 DLL 部署到每个位置。我可以 GAC 核心内容,但它仍然看起来有点矫枉过正。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多