1

我正在使用 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 服务启动并查看 <services /> 集合中的所有内容,并为每个服务生成一个线程以加快启动时间,每个线程都包含一个 AppDomain 服务真正存在的地方,所以如果服务有某种类型故障它不会使系统停机。

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

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

4

2 回答 2

1

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

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

于 2009-06-25T21:26:46.310 回答
0

我有三个建议:

首先,如果一个电话可能需要 5 个多小时,我会考虑排队/回叫风格的架构。

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

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

于 2009-06-20T22:19:54.203 回答