并行执行Web服务调用

时间:2011-04-21 18:01:19

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

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

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

一些注意事项:

  • 缓存结果将是下一个实现细节,但我希望首先使用基本功能
  • 每个网络服务返回非常少的数据(在kb下),最长的数据返回的时间不超过3秒,我相信大部分时间是延迟(生成结果的计算成本不高)
  • 从客户端调用网络服务不起作用(我不认为),因为有些人在不同的域名中
  • 要么F#实现的C#理想情况下这将被抽象为一个方法调用,该方法调用需要string并返回string s的集合

2 个答案:

答案 0 :(得分:3)

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

通过简单地通过TPL对数十个和数百个任务执行同步IO调用来尝试实现高规模和高带宽/吞吐量将使您无法快速完成。

答案 1 :(得分:3)

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