我正在研究一种应用程序,它需要一种类型的消息去击中数据库,另一种类型的消息去打一些外部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