首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在发出HTTP请求时避免网络节流

在发出HTTP请求时避免网络节流
EN

Stack Overflow用户
提问于 2017-01-11 15:56:09
回答 1查看 1.2K关注 0票数 1

在发出HTTP when请求时,我遇到了一个非常具体的问题。更具体地说,应用程序是24/7发出请求,并更新我的数据库表。由于其他用户也在执行请求,我遇到了这样的情况:当我使用并行的for循环和并发包的组合来加快速度时,其他用户的网站性能会大幅下降。在某个时候,当用户+应用程序发出请求时,网站变得非常缓慢和没有响应能力。因此,我现在的问题如下:

我如何限制它在特定时刻所做的can请求的应用量?

例如,如果有10000个端口可用,应用程序可以通过这些端口发出web请求。我希望能够告诉应用程序使用10/15线程在一次提出请求,同时不放慢网站的用户,这样就没有网络节流。

我读了几篇文章,有些人建议使用slim信号量,但我不知道如何将它与我的web请求配对,该请求如下所示:

代码语言:javascript
复制
  private string MakeHTTPWebRequest(string requestXML)
        {
            var request = (HttpWebRequest)WebRequest.Create("https://api.ebay.com/ws/api.dll");
            string GetItemTransactionXMLRequest = null;
            byte[] bytes = null;
            bytes = System.Text.Encoding.ASCII.GetBytes(requestXML);
            ServicePointManager.DefaultConnectionLimit = 9999;
            ServicePointManager.Expect100Continue = false;
            request.Method = "POST";
            request.ContentType = "application/xml";
            request.Accept = "application/xml";
            request.Proxy = null;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    string responseStr = new StreamReader(responseStream).ReadToEnd();
                    responseStream.Flush();
                    responseStream.Close();
                    return responseStr;
                }
                return null;
            }
        }

我现在就是这样做的:

代码语言:javascript
复制
Parallel.For(0,somelength,i=> List.Add(MakeHTTPWebRequest("Some xml request here")));

上面的方法给了我可怕的网络节流。我如何做到这一点,以便应用程序知道它是否导致网络节流,以减少调用数量,或者在用户发出请求时等待,然后继续请求?

同时,这又提出了另一个问题和问题,我如何将这个set请求中的超时设置为unlimted xxx分钟,以便应用程序可以等待其他人完成他们的请求,以便继续从API获取结果……

有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-11 19:29:05

每次发出HTTP请求时,都会设置一些全局变量。我建议只设置一次。

我希望能够告诉应用程序一次使用10/15线程来发出请求。

最快的修复方法是将一个ParallelOptions参数传递给Parallel.For,将MaxDegreeOfParallelism设置为10/15

我还建议考虑使代码异步,因为这是一个I/O绑定操作。这就是您将使用SemaphoreSlim进行节流的地方。

我如何做到这一点,以便应用程序知道是否导致网络节流以减少调用数量

这是个很难解决的问题。您必须测量您的响应时间,并将它们输入到建立“正常响应时间”的例程中,然后在响应时间开始变得太大时开始节流。这是假设您的应用程序是节流的,类似于用户的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41595278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档