我需要群发HTTP (对于财务应用,主机不提供更好的API)请求(大约 800每秒)和处理他们的响应(在JSON中,通常不超过1kb)具有低延迟(仅执行反序列化并比较某些值)到最后< em>根据响应发出另一个请求(响应和下一个请求之间的时间不应超过1-2毫秒)。
目前,我使用带有同步请求的传统线程,其中大约50%的线程仅在40-60秒后执行请求,而另外50%的线程始终请求
虽然这种方法在每秒大约50-100个请求下运行良好,但我遇到了每秒800个请求,响应和线程的下一个请求之间的时间过长(通常为50-200ms)。
我想解决,我想问:
的 1。异步操作是更好的方法吗?
阅读了很多关于使用Asyncs获得的可伸缩性和响应性,但不确定它是否适合低延迟(上下文切换,任务创建等开销)
的 2。我可以调整Thread aprroach吗? (独立于Quest#1) 当我们正在处理响应时,我正在考虑给予线程更高的优先级(超过.ThreadPriority
),但这并没有真正解决/可能完全停止处理时执行其他线程
(3.我应该使用哪个类别/ Lib for HTTP Request?) 目前正在使用HttpWebRequest
,这比我测试中的HttpClient
快一点,或者我应该使用其他东西吗?
任何帮助将不胜感激
答案 0 :(得分:3)
我经历过并解决了这个问题(从服务器并行下载大量XML文件),根据我的经验,使用Async的速度提高了20%-50%,具体取决于文件的大小。
不幸的是,这是几个月前,但我在每个请求中使用了一个WebClient,只是在做一个WebClient.DownloadString,所以如果这是你的用例,它可能适合你。
真正的答案是:尝试两者并对其进行分析。在两者之间切换并不难!
答案 1 :(得分:0)
根据我的经验,System.Net.Http.HttpClient
可以满足您的需求。与此相关的一个挑战是设置并行连接的数量。您无法直接使用HttpWebRequest.ConnectionLimit
属性,因此您必须浏览ServicePointManager
:
ServicePoint servicePoint = ServicePointManager.FindServicePoint(uri);
servicePoint.ConnectionLimit = connectionLimit;
然后,您可以将任务用于并行操作,并使用Task.WhenAll
等待结果。