【问题标题】:Parallel.foreach() with WebRequest. 429 errorParallel.foreach() 与 WebRequest。 429 错误
【发布时间】:2017-06-21 13:59:08
【问题描述】:

我目前正在运行一个脚本,该脚本在很长一段时间内访问 api 大约 3000 次。我正在使用 parallel.foreach() 以便我可以一次发送几个请求以加快进程。我在每次 foreach 迭代中创建两个请求,所以我应该有不超过 10 个请求。我的问题是,我不断收到来自服务器的 429 个错误,我与管理服务器的人交谈,他们说他们看到的请求数量超过 40 个。以我目前对代码的理解,我认为这是不可能的,如果我在这里遗漏了什么,有人可以告诉我吗?

    public static List<Requests> GetData(List<Requests> requests)
    {
        ParallelOptions para = new ParallelOptions();
        para.MaxDegreeOfParallelism = 5;

        Parallel.ForEach(requests, para, request =>
        {
            WeatherAPI.GetResponseForDay(request);
        });

        return requests;
    }

    public static Request GetResponseForDay(Request request)
    {
        var request = WebRequest.Create(request);
        request.Timeout = 3600000;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader myStreamReader = new 
        StreamReader(response.GetResponseStream());
        string responseData = myStreamReader.ReadToEnd();
        response.Close();

        var request2 WebRequest.Create(requestthesecond);
        HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
        StreamReader myStreamReader2 = new 
        StreamReader(response2.GetResponseStream());
        string responseData2 = myStreamReader2.ReadToEnd();
        response2.Close();

        DoStuffWithData(responseData, responseData2)

        return request;
    }

【问题讨论】:

  • 我认为 429 来自某个时间单位的请求计数,所以也许您没有并行 40 多个请求,但在 1 秒内您会生成更多请求。请添加一些衡量 1 个请求的处理时间或询问服务器管理员的限制是多少。无论如何,如果您想遵守这样的限制(即每秒最多 40 个请求)或者您需要减少并行度,则必须重新编写此代码。
  • 来自搜索的人:考虑这个问题的答案中的方法:.net Core Parallel.ForEach issues。这不是完全相同的问题,但this answer 有一些很好的建议。

标签: c# asp.net asp.net-web-api webrequest parallel.foreach


【解决方案1】:

正如 smartobelix 指出的那样,您将 degreeofparallelism 设置为 5 不会阻止您发送服务器端策略定义的过多请求。它所做的只是防止您耗尽发出这些请求所需的线程数。所以你需要做的是与服务器所有者沟通,熟悉他们的限制并更改你的代码以永远不满足限制。

涉及的变量有:

  1. 您将发送的并发请求数(并行性)
  2. 一个请求的平均时间
  3. 服务器允许的每单位时间的最大请求数

因此,例如,如果您的平均请求时间为 200 毫秒,并且您的最大并行度为 5,那么您可以期望平均每秒发送 25 个请求。如果每个请求需要 500 毫秒,那么您将只发送 10 个。

将服务器允许的号码混入其中,您将了解如何微调您的号码。

【讨论】:

    【解决方案2】:

    以上两个答案基本上都是正确的。我遇到的问题是服务器管理器将速率限制设置为 100 个请求/分钟,而以前没有请求,也没有通知我。一旦达到 100 个请求/分钟的限制,我几乎立即开始收到 429 个错误,并开始以同样的速度发出请求,这些请求也收到 429 个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      相关资源
      最近更新 更多