在发出HTTP when请求时,我遇到了一个非常具体的问题。更具体地说,应用程序是24/7发出请求,并更新我的数据库表。由于其他用户也在执行请求,我遇到了这样的情况:当我使用并行的for循环和并发包的组合来加快速度时,其他用户的网站性能会大幅下降。在某个时候,当用户+应用程序发出请求时,网站变得非常缓慢和没有响应能力。因此,我现在的问题如下:
我如何限制它在特定时刻所做的can请求的应用量?
例如,如果有10000个端口可用,应用程序可以通过这些端口发出web请求。我希望能够告诉应用程序使用10/15线程在一次提出请求,同时不放慢网站的用户,这样就没有网络节流。
我读了几篇文章,有些人建议使用slim信号量,但我不知道如何将它与我的web请求配对,该请求如下所示:
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;
}
}我现在就是这样做的:
Parallel.For(0,somelength,i=> List.Add(MakeHTTPWebRequest("Some xml request here")));上面的方法给了我可怕的网络节流。我如何做到这一点,以便应用程序知道它是否导致网络节流,以减少调用数量,或者在用户发出请求时等待,然后继续请求?
同时,这又提出了另一个问题和问题,我如何将这个set请求中的超时设置为unlimted xxx分钟,以便应用程序可以等待其他人完成他们的请求,以便继续从API获取结果……
有人能帮我解决这个问题吗?
发布于 2017-01-11 19:29:05
每次发出HTTP请求时,都会设置一些全局变量。我建议只设置一次。
我希望能够告诉应用程序一次使用10/15线程来发出请求。
最快的修复方法是将一个ParallelOptions参数传递给Parallel.For,将MaxDegreeOfParallelism设置为10/15。
我还建议考虑使代码异步,因为这是一个I/O绑定操作。这就是您将使用SemaphoreSlim进行节流的地方。
我如何做到这一点,以便应用程序知道是否导致网络节流以减少调用数量
这是个很难解决的问题。您必须测量您的响应时间,并将它们输入到建立“正常响应时间”的例程中,然后在响应时间开始变得太大时开始节流。这是假设您的应用程序是节流的,类似于用户的情况。
https://stackoverflow.com/questions/41595278
复制相似问题