-
06-07-2019 - |
题
我正在使用WCF和NetTCP服务编写企业级应用程序。我最初出于好奇而选择了NetTCP,但后来确定它是我的最佳选择,因为我可以使用被称为需要5个小时以上的服务来返回结果,因为涉及的数据量很大。
我目前产生服务的方式是一个多步骤的过程。我有一个配置文件(使用System.Configuration),它指定了一些默认的东西(端口号,连接客户端的服务器名称,是否启用HTTP以及NetTCP等),并且有一个<!>集合的集合;服务QUOT <!>;在它下面。例如,这是基本的:
<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服务启动并查看<!> lt; services / <!> gt;中的所有内容。收集并生成每个服务的线程以加快启动时间,每个线程包含一个AppDomain,服务真正存在,所以如果服务有某种故障,它不会导致系统崩溃。
<!>“问题<!>”;我遇到的是这个应用程序正在托管大约20个服务,所有服务启动和运行需要15-20秒。我做了线程和AppDomain片段以使其达到该值(过去每个服务按顺序打开需要花费一分钟),但在我看来,这实际上可以更快。
有人有什么建议吗? 谷歌 Bing有很多用于托管一项服务的例子,但是我找不到真正的应用程序(遗憾的是<!>“Hello World <!>”;只是不是吸引最终用户)。如果您目前通过Windows服务和NetTCP托管多项服务,您是如何做到的?
解决方案
我终于弄明白了,毕竟它与WCF或我的配置文件无关。当我创建AppDomain时,我从另一个项目中窃取了代码,这个项目的大小要小得多,并且发现创建AppDomains的部分使用的是SingleDomain选项。将其更改为MultiDomain会使事情变为<!> gt;总负载为4秒,内存使用率从~150MB降至约40MB。
感谢您的帮助 - 至少它让我再次审查了代码!
其他提示
我有三个建议:
首先,如果通话需要5个多小时,我会考虑排队/回拨风格的架构。
考虑将您的服务拆分为20个Windows服务,其中每个服务都在其自己的Windows服务中运行。这增加了复杂性并增加了内存使用量,但可以更快地获得单个服务。
最后,检查服务的consructor中的代码,以查找任何不需要的代码。