【问题标题】:What is the best practice for doing httpclient call parallelly/sequentially with very good performance and without loosing data [closed]在不丢失数据的情况下并行/顺序调用 httpclient 的最佳实践是什么?
【发布时间】: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


【解决方案1】:

您可以尝试将 cmets 中的解决方案与 when all 结合使用:https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=net-5.0

private static HttpClient Client = new HttpClient();
public static async Task Main(string[] args) 
{
    var tasks = new List<Task>();      
    Console.WriteLine("Starting connections");
    for(int i = 0; i<10; i++)
    {
        tasks.Add(Client.GetAsync("http://aspnetmonsters.com"))
        Console.WriteLine(result.StatusCode);
    }
    Task t = Task.WhenAll(tasks);
    try {
       t.Wait();
    }
    catch {}   
    Console.WriteLine("Connections done");
    Console.ReadLine();
}

【讨论】:

  • 这段代码一次能处理1000+个请求吗
  • 这取决于您在返回时会做什么。正如我的 cmets 中所说,尝试一次批处理 100 个并相应地进行微调。
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多