Async vs Threads用于大规模,低延迟的http请求

时间:2014-08-11 22:16:04

标签: c# multithreading http asynchronous synchronous

我需要群发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快一点,或者我应该使用其他东西吗?

任何帮助将不胜感激

2 个答案:

答案 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等待结果。