异步与线程用于大规模、低延迟的 http 请求
本文关键字:延迟 http 请求 线程 用于 大规模 异步 | 更新日期: 2023-09-27 18:17:36
我需要做大量的HTTP(对于金融应用程序,主机没有提供更好的API(请求(每秒约800个(并处理它们的响应(在JSON中,通常不超过1kb大(具有低延迟(仅进行反序列化和比较某些值(以最终根据响应发出另一个请求(响应和下一个请求之间的时间不应超过 1-2 毫秒(。
目前,我将传统的线程与同步请求一起使用,其中大约 50% 的线程仅在 40-60 秒后执行请求,而其他 50% 的线程始终在请求
虽然这种方法在每秒大约 50-100 个请求时效果很好,但我体验到每秒 800 个请求,线程的响应和下一个请求之间的时间太长了(通常为 50-200 毫秒(。
当我想解决这个问题时,我想问一下:
1. 异步操作是更好的方法吗?阅读了很多关于使用异步获得可扩展性和响应能力的信息,但不确定它是否有利于低延迟(上下文切换、任务创建等开销(
2. 我可以调整线程参数吗?(独立于任务#1(我在考虑诸如在线程当前处理响应时为线程提供更高的优先级(超过 .ThreadPriority
(,但这并没有真正奏效/也许在处理
时完全停止执行其他线程(3. 我应该使用哪个类/库来请求HTTP请求?目前使用的是HttpWebRequest
s,它比我的测试中的HttpClient
快一点,还是我应该使用其他东西?
任何帮助将不胜感激
我经历了并解决了这个确切的问题(用于从服务器并行下载大量XML文件(,根据我的经验,使用Async的速度提高了约20%-50%,具体取决于文件的大小。
不幸的是,这是几个月前的事了,但我在每个请求中使用了一个WebClient,只是做了一个WebClient.DownloadString,所以如果这是你的用例,它可能对你有用。
真正的答案是:尝试两者并对其进行剖析。 在两者之间切换应该不难!
根据我的经验,System.Net.Http.HttpClient
表现足以满足您的需求。其中一个挑战是设置并行连接的数量。您不能直接使用 HttpWebRequest.ConnectionLimit
属性,因此您必须通过以下ServicePointManager
:
ServicePoint servicePoint = ServicePointManager.FindServicePoint(uri);
servicePoint.ConnectionLimit = connectionLimit;
然后,您可以将任务用于并行操作,并使用 Task.WhenAll
等待结果。