并行执行Web服务调用

我看到这些问题建议在大约一年前在ASP.NET和Async.Parallel或Array.Parallel.Map 中并行执行.NET HttpWebRequests,并且想知道他们的建议是否仍然存在或者现在是否有更好的方法使用Task并行库 。

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

几点说明:

  • 缓存结果将是下一个实现细节,但我希望首先使用基本function
  • 每个Web服务返回非常少的数据(在kb下),最长的数据返回不超过3秒,我相信大部分是延迟(生成的结果不是计算上昂贵的)
  • 从客户端调用Web服务是行不通的(我不认为),因为有些是在不同的域中
  • F#实现的C#都可以理想地工作,这将被抽象为一个方法调用,它接受一个string并返回一个string集合s

您可能会发现此讨论相关: Async而不是Parallel

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

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