【问题标题】:Boosting performance on async web calls提高异步 Web 调用的性能
【发布时间】:2013-04-05 17:59:15
【问题描述】:

背景:我必须调用 Web 服务调用 1500 次,大约需要 1.3 秒才能完成。 (无法控制此第 3 方 API。)总时间 = 1500 * 1.3 = 1950 秒 / 60 秒 = 大约 32 分钟。

我想出了一个我认为很好的解决方案,但它并没有那么好。 所以我将调用更改为异步网络调用,认为这会极大地帮助我的结果,但它没有。

示例代码:

预优化:

foreach (var elmKeyDataElementNamed in findResponse.Keys)
{

    var getRequest = new ElementMasterGetRequest
    {
        Key = new elmFullKey
        {
            CmpCode = CodaServiceSettings.CompanyCode,
            Code = elmKeyDataElementNamed.Code,
            Level = filterLevel
        }
    };

    ElementMasterGetResponse getResponse;
    _elementMasterServiceClient.Get(new MasterOptions(), getRequest, out getResponse);
    elementList.Add(new CodaElement { Element = getResponse.Element, SearchCode = filterCode });
}

优化:

var tasks = findResponse.Keys.Select(elmKeyDataElementNamed => new ElementMasterGetRequest
    {
        Key = new elmFullKey
            {
                CmpCode = CodaServiceSettings.CompanyCode,
                Code = elmKeyDataElementNamed.Code,
                Level = filterLevel
            }
    }).Select(getRequest => _elementMasterServiceClient.GetAsync(new MasterOptions(), getRequest)).ToList();

Task.WaitAll(tasks.ToArray());

elementList.AddRange(tasks.Select(p => new CodaElement
    {
        Element = p.Result.GetResponse.Element,
        SearchCode = filterCode
    }));

小样本示例: 因此,为了轻松测试,我对 40 条记录进行了较小的采样,这需要 60 秒,没有优化,优化只需要 50 秒。我本来应该会接近 30 或更好。

我使用 Wireshark 观察交易的通过,并意识到异步方式的发送速度并没有我想象的那么快。

捕获的异步请求

正常无优化 您可以看到 asnyc 非常快地推动了一些然后下降...... 另请注意,在请求 10 和 11 之间花费了将近 3 秒。

为慢速任务创建线程的开销是否需要几秒钟? 注意:我指的任务是 4.5 TAP 任务库。

为什么请求不会比这更快。 有人告诉我,我访问的 Apache Web 服务器最多可以容纳 200 个线程,所以我看不到那里有问题..

我没有想清楚吗? 调用 Web 服务时,异步请求有什么好处吗? 我有代码错误吗? 任何想法都会很棒。

【问题讨论】:

  • 在执行调用所需的 1.3 秒中,有多少时间用于实际在服务器上执行工作?如果服务器需要 1.2 秒来执行工作并且存在资源限制,那么异步可能不会产生影响。
  • 了解服务器可能总是需要 1.3 秒,但如果请求同时运行,那么它应该需要更多时间对吗?
  • 这取决于资源限制。有些东西不会从并发中受益,有些东西甚至会受到它的伤害。这取决于导致服务器花费 1.3 秒的原因。它可能不会从并发中受益。
  • 忘记在服务器上运行所需的时间,到达服务器的请求才是我关心的。有时服务器没有收到我的请求,例如请求 10 和 11,它花了将近 3 秒才能到达服务器。我什至没有看服务器的响应有多长时间。我只是希望我可以在 15 秒内发送所有请求,然后随时得到响应。
  • 除了总并发请求数之外,可能还有来自单个 IP 地址的并发请求数的限制。也就是说,虽然服务器可能能够同时处理 200 个请求,但它不一定会允许任何一个客户端使用所有这些请求。如果是这样的话,个人对网络服务器进行 DDOS 攻击会很简单。

标签: c# web-services asynchronous


【解决方案1】:

经过几天的搜索,我发现这篇文章解决了我的问题: Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry)

请求没有更快地到达服务器的原因也是由于我的客户端代码与服务器无关。默认情况下,C# 只允许 2 个并发请求。 看这里:http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

我只是添加了这行代码,然后所有请求都在几毫秒内完成。

System.Net.ServicePointManager.DefaultConnectionLimit = 50;

【讨论】:

  • 那么您是否也在您提到的帖子中更改了注册表,或者您是否只更改了 System.Net.ServicePointManager.DefaultConnectionLimit ?
  • 不需要更改注册表,这仅适用于 IE(如果我没记错的话),这并没有解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2021-06-15
  • 1970-01-01
相关资源
最近更新 更多