Ejecutando llamadas de servicio web en paralelo

Vi estas preguntas Recomendaciones para ejecutar .NET HttpWebRequests en paralelo en ASP.NET y Async.Parallel o Array.Parallel.Map desde hace aproximadamente un año y me preguntaba si los consejos de ellos siguen vigentes o si ahora hay un mejor enfoque con Task Biblioteca paralela .

Mi caso está más cerca de la segunda pregunta, excepto que solo necesito acceder a 10 (ish) servicios web diferentes en lugar de al mismo 3000 veces. Como esta es una aplicación web, ¿ese tipo de amplificación de solicitud cambia el enfoque sugerido? ¿Hay un mejor enfoque para tomar? ¿Qué tan bien puedo esperar que algo como esto se incremente a medida que aumenta el número de usuarios?

Algunas notas:

  • Los resultados del almacenamiento en caché serán el siguiente detalle de implementación, pero me gustaría que la funcionalidad básica funcionara primero
  • Cada servicio web devuelve muy pocos datos (bajo un kb), el más largo no tarda más de 3 segundos en volver y creo que la mayor parte de esto es latencia (la generación de resultados no es computacionalmente costosa)
  • Llamar a servicios web desde el cliente no funcionará (no lo creo) ya que algunos están en diferentes dominios
  • Cualquiera de las implementaciones de C # de F # funcionaría como idealmente, esto se abstraerá de una llamada de método que toma una string y devuelve una colección de string s

Puede que esta discusión sea relevante: asíncrono en lugar de paralelo.

Las solicitudes web no son adecuadas para TPL, ya que son IO, no procesadas. Ya contaba con toda la infraestructura necesaria desde .Net 2.0: BeginGetResponse y BeginGetResponseStream . Mantenga un límite en el número de solicitudes pendientes (~ 200 es un buen sistema operativo para el consumidor, ~ 2000 es para los servidores, después de ajustar los parámetros de TCP, especialmente TcpNumConnections ) y asegúrese de ajustar el ServicePointManager.DefaultConnectionLimit .

Intentar lograr una gran escala y un alto ancho de banda / rendimiento simplemente lanzando llamadas de IO sincrónicas a decenas y cientos de tareas a través de TPL no lo llevará a ninguna parte rápidamente.