【发布时间】:2020-12-02 17:58:00
【问题描述】:
我们需要执行批量 API 请求(超过 1000 次调用)并将响应数据保存在数据库中。
最初我们有 10-20 个 API 调用要求。对于这些请求,我们使用带有单个 HTTPClient 实例的简单“for 循环”来获取数据并将其保存到数据库中。
后来我们得到了 100-200 次 API 调用要求。对于这些请求,我们使用 Parallel.ForEach 和单个 HTTPClient 实例,但我们遇到了套接字问题。所以我们为每个请求创建了新实例。甚至这种方法也会导致服务器出现问题。
现在要求是执行 1000+ API 调用。
使用“等待”的单个 HTTPClient 实例需要数小时才能完成操作。
有没有什么方法或好的做法可以在 C# 中进行 1000 多个 api 调用并且性能非常好并且不会丢失数据?
【问题讨论】:
-
您是否尝试在没有等待的情况下触发异步客户端调用并使用
Task.WhenAll?另外,您是否有机会控制您正在调用的端点?如果您这样做了,那么您可能会考虑创建一个对批量更友好的端点,您可以在其中传递参数集合并返回响应集合以减少 HTTP 流量(如果该方法适用于您的场景)。 -
假设您没有使用 net core(并且可以使用 IHttpClientFactory),请参阅 You're using HttpClient wrong and it is destabilizing your software - 这(可能)解释了您看到套接字问题的原因以及如何解决这些问题。
-
@stuartd- 我浏览了那个链接,但是使用 await 它需要几个小时才能完成操作。
-
您是否对 API Uri -
ServicePointManager.FindServicePoint(new Uri(url)).ConnectionLimit = howeverManyConcurrentRequestsYouWant;或 ServicePointManager.DefaultConnectionLimit 设置了连接限制?netstat显示的连接是什么?
标签: c# azure httpclient