【问题标题】:Executing web-service calls in parallel并行执行 Web 服务调用
【发布时间】:2011-04-21 18:01:19
【问题描述】:

我从大约一年前看到Recommendations for executing .NET HttpWebRequests in parallel in ASP.NETAsync.Parallel or Array.Parallel.Map 这些问题,想知道他们的建议是否仍然有效,或者现在是否有更好的方法 Task Parallel Library

我的情况更接近第二个问题,除了我只需要点击 10 个(ish)不同的网络服务而不是同一个网络服务 3000 次。由于这是一个 Web 应用程序,这种请求放大是否会改变建议的方法?有没有更好的方法可以采取?随着用户数量的增加,我能期望这样的事情在多大程度上扩展?

几点说明:

  • 缓存结果将是下一个实现细节,但我希望先让基本功能正常工作
  • 每个 Web 服务返回的数据非常少(不到 1 kb),最长的返回时间不超过 3 秒,我相信其中大部分是延迟(生成结果的计算成本不高)
  • 从客户端调用 Web 服务将不起作用(我不认为),因为有些位于不同的域中
  • 无论是 C# 还是 F# 实现都可以理想地工作,这将被抽象为一个方法调用,该方法调用采用 string 并返回 strings 的集合

【问题讨论】:

  • 关于跨域问题,我们通过在 Web 应用程序中使用服务代理解决了这个问题。实施起来非常简单。只需向项目添加服务,让服务合同实施远程合同。然后通过简单地将参数传递给真实服务并返回结果来实现合同。
  • @Smudge202:服务器代理会解决跨域问题,但随着用户数量的增加,我基本上会在自己的服务器上进行 DDoSing =)。

标签: c# .net web-services f# task-parallel-library


【解决方案1】:

您可能会发现此讨论相关:Async instead of Parallel

【讨论】:

    【解决方案2】:

    Web 请求不适合 TPL,因为它们是 IO,而不是处理。自 .Net 2.0 以来,您已经拥有所有必要的基础设施:BeginGetResponseBeginGetResponseStream。控制未完成请求的数量(~200 是一个很好的消费者操作系统,~2000 是服务器风格,在相应地调整 TCP 参数之后,特别是 TcpNumConnections)并确保调整 ServicePointManager.DefaultConnectionLimit

    试图通过简单地通过 TPL 对数十个和数百个任务进行同步 IO 调用来实现高规模和高带宽/吞吐量,这将让您一事无成。

    【讨论】:

    • 该死,免费午餐仍然遥遥无期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2016-04-07
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多