2009-06-20 260 views
1

我正在編寫利用WCF和NetTCP服務的企業級應用程序。我最初出於好奇而選擇了NetTCP,但後來確定它是我的最佳選擇,因爲我可以使用稱爲服務的服務,因爲所涉及的數據處理量大,需要5個多小時才能返回結果。WCF自我託管性能

我目前產生我的服務的方式是一個多步驟的過程。我有一個配置部分(使用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託管多項服務,那麼您最近怎麼做?

+0

它需要比這更快嗎?如果它每天只啓動一次,那麼這是每天20秒。這不是很長時間。 – 2009-06-20 20:58:07

+0

這主要是在調試過程中,它比較慢,所以這是我試圖擠出性能的主要區域。服務本身將無限期地運行(減去重啓等等)。 – RubyHaus 2009-06-21 21:50:57

回答

1

我終於明白了,它畢竟與WCF或我的配置無關。當我創建AppDomain時,我偷走了另一個項目的代碼,該項目的規模小得多,發現創建AppDomain的部分使用的是SingleDomain選項。將其更改爲MultiDomain使總負載和內存使用量從大約150MB下降到〜40MB大於4秒。

感謝您的幫助,但至少它讓我重新審查了代碼!

0

我有三個建議:

首先,如果呼叫可以採取5+小時,我會考慮的排隊/自動回叫風格的建築。

考慮將您的服務分成20個windows服務,其中每個服務運行在它自己的windows服務中。這增加了複雜性並增加了內存使用量,但個別服務可能會更快。

最後,檢查服務的consructor中的代碼,查看是否有任何不需要的代碼。