我正在研究一種應用程序,它需要一種類型的消息去擊中數據庫,另一種類型的消息去打一些外部xml api。HttpWebRequest和I/O完成端口
我必須處理一個很大的挑戰之一是讓HttpWebRequest類表現良好。我最初開始只使用標準的同步方法,並將整個線程化。這並不好。
那麼一點閱讀後,我看到推薦的方式做,這是使用的開始/結束的方法來工作委託給IO完成端口,從而釋放線程池,併產生更好的性能。這似乎並不是這種情況...性能稍微好一些,但我相信與線程池相比,我完全看不到IO完成端口的使用。
我有一個線程輪換並向我發送線程池中可用的工作線程+完成端口。完成端口總是非常低(我見過的最大值是9),而且我總是使用大約120個工作線程(有時更多)。我用所有的方法httpwebrequest
的開始/結束模式:
Begin/EndGetRequestStream
Begin/EndWrite (Stream)
Begin/EndGetResponse
Begin/EndRead (Stream)
我這樣做對嗎?我錯過了什麼嗎?我可以同時使用(有時)多達2048個http連接(來自netstat輸出) - 爲什麼完成端口號會很低?
如果有人可以給一些嚴肅的建議,關於如何做好這個管理工作者線程,完成端口和httpwebrequest
將非常感激!
編輯:.NET是一個合理的工具嗎?我可以獲得大量的使用.NET和System.Net堆棧的httpconnections嗎?有人建議使用類似WinHttp(或其他C++庫)的東西,並從.NET中調用它,但這不是我特別想做的事情!
您的外部API是否正確處理負載?我有一個外部服務,如果我發送太多的請求,服務服務器上的性能會有明顯的下降。 – btlog 2011-01-26 14:13:36
@btlog - >是的,好像我禁用了一些外部提供者,其他提供者產生更好的時間(但接收到相同的呼叫量)。如果問題是在他們身上,那麼無論我對其他XML服務做什麼都不會影響其他服務。 – peteisace 2011-01-27 07:08:03