2009-02-05 90 views
2

我有一個網絡服務放緩。我的(網絡)服務在gsoap &託管C++。這不是IIS/apache託管,而是說xml。 我的客戶端在.NET 服務計算時間很短(< 0.1s準備回覆)。我希望這項服務能夠流暢,快速並具有良好的可用性。 我有大約100個客戶,響應時間是1s強制性的。 客戶每分鐘有大約1個請求。 客戶正在通過tcp open port test檢查Web服務狀態。 因此,爲了避免可能的擁塞,我將gSoap KeepAlive設置爲false。 直到有一切運行良好:我可以看到TCPView(sysinternals)中的連接網絡服務放緩

新的特殊同步程序現在在循環中調用服務。 負載較高,但所有內容都在30秒內處理完畢。 使用sysinternals TCPView,我看到大約1千個連接在TIME_WAIT中。 他們減慢了服務速度,現在服務需要幾秒鐘才能回覆。

難道我需要重置SoapHttpClientProtocol連接嗎? 有人有TIME_WAIT幽靈與循環中的Web服務調用?

回答

1

聽起來就像您在呼叫後沒有關閉連接並在每個請求中打開新連接。關閉連接或重新使用打開的連接。

+0

我同意。我希望服務器端的KeepAlive = false,但在客戶端的 ,.NET似乎更喜歡回收默認情況下。 我發現這個解決方案: http://yakkowarner.blogspot.com/2008/11/calling-web-service-in-loop.html 但它看起來很重。我正在嘗試那個: http://forums.asp.net/t/1003135.aspx – wiwulo 2009-02-05 08:44:13

0

對上述實現要非常小心。他們遇到嚴重的問題。

  1. 在yakkowarner.blogspot.com/2008/11/calling-web-service-in-loop.html(COMMENT上文)的實施:

    問題:所有的工作將是在下次使用wsdl.exe重新生成Web服務時將被清除,並且您將忘記您沒有提及此修補程序相當於依靠消息字符串採取措施的問題。

  2. 在forums.asp.net/t/1003135.aspx(COMMENT上文)的實施:

    問題:您在5000到65535之間選擇一個端點,這樣表面上這看起來像一個好主意。如果你仔細想想,沒有辦法(至少我沒有想到)可以預留稍後使用的端口。你如何保證列表中的下一個端口目前不被使用?您將順序拾取要使用的端口,如果某個其他應用程序選擇列表中下一個端口,那麼您將被徹底清理。或者如果您的客戶端機器上運行的其他應用程序開始使用隨機端口進行連接,您將會受到UNPREDICTABLE時間點的影響。你會隨意得到一個錯誤消息,如「遠程主機無法訪問或不可用」 - 更難以排除故障。

雖然我不能給你正確的解決這個問題,有些事情你可以做的是:

  1. 儘量減少Web服務請求的數量或更分散出來過更長的時間段
  2. 對於您的應用類型,也許Web服務不是正確的架構 - 對於響應時間爲1ms的應用,您應該使用郵件系統 - 而不是Web服務
  3. 設置您的操作系統允許的連接數到65K使用註冊表中的視窗
  4. 設置你的操作系統的時候,插座留在TIME_WAIT一些較低的數字(此提出自己的問題清單)