Estoy extrayendo datos JSON de varios servidores remotos simultáneamente a través de HTTP, utilizando un servicio WCF en los puntos finales del cliente y del servidor. Me doy cuenta de que, por cada solicitud sucesiva que comienza de forma asíncrona, el tiempo que tarda la solicitud http generalmente aumenta, incluso si la cantidad de datos no aumenta necesariamente. En otras palabras, si comienzo a 12 hilos de rosca de la piscina (con la tecla FUNC <> .BeginInvoke), entonces cada solicitud, después de haber sido programada, está apareciendo en mis registros, tales como:Descarga simultánea de datos JSON desde servicio (s) remoto
:HttpRequest invoked. Elapsed: 325ms
:HttpRequest invoked. Elapsed: 27437ms
:HttpRequest invoked. Elapsed: 28642ms
:HttpRequest invoked. Elapsed: 28496ms
:HttpRequest invoked. Elapsed: 32544ms
:HttpRequest invoked. Elapsed: 38073ms
:HttpRequest invoked. Elapsed: 41231ms
:HttpRequest invoked. Elapsed: 47914ms
:HttpRequest invoked. Elapsed: 45570ms
:HttpRequest invoked. Elapsed: 61602ms
:HttpRequest invoked. Elapsed: 53567ms
:HttpRequest invoked. Elapsed: 79081ms
El proceso es bastante simple. Simplemente estoy comenzando cada solicitud en un bucle y luego llamo a .WaitAll() en todas las operaciones antes de usar los datos consolidados.
Parece que las solicitudes Http están llevando más tiempo de lo que deberían, incluso con pequeñas cantidades de datos. De hecho, la diferencia entre pequeñas y grandes cantidades de datos parece mínima en general. ¿Este tipo de cuello de botella se debe a solicitudes simultáneas de http que tienen que compartir ancho de banda, o hay un problema de subprocesamiento/cambio de contexto posible aquí? Solo mirando para ser apuntado en la dirección correcta.
EDITAR - Sólo para mayor claridad, me encontré con el mismo proceso sincrónicamente y aquí están los resultados:
:HttpRequest invoked. Elapsed: 20627ms
:HttpRequest invoked. Elapsed: 16288ms
:HttpRequest invoked. Elapsed: 2273ms
:HttpRequest invoked. Elapsed: 4578ms
:HttpRequest invoked. Elapsed: 1920ms
:HttpRequest invoked. Elapsed: 564ms
:HttpRequest invoked. Elapsed: 1210ms
:HttpRequest invoked. Elapsed: 274ms
:HttpRequest invoked. Elapsed: 145ms
:HttpRequest invoked. Elapsed: 21447ms
:HttpRequest invoked. Elapsed: 27001ms
:HttpRequest invoked. Elapsed: 1957ms
El tiempo total (debido a que su síncrono) subió, sin embargo se puede ver claramente que cada solicitud individual es generalmente más rápida. Lamentablemente, no conozco ninguna forma de aislar el problema, pero creo que es un problema de intercambio de ancho de banda entre los hilos.
Así que alguna pregunta más sencilla que tengo es:
1) Si utilizo un subproceso no subprocesos, sería esta mejora
2) ¿Debo agrupar las operaciones en sólo unos pocos hilos, en lugar que cada solicitud tiene la suya?
3) ¿Es este un problema estándar cuando se intenta descargar datos simultáneamente a través de Http?
En realidad, también estoy lidiando con algo del mismo problema con múltiples httpRequests concurrentes. Si envío 50 solicitudes al mismo tiempo, la primera vuelve en 300 ms, y la última vuelve después de 2000 ms. Sus resultados parecen indicar que hay algo más que está sucediendo. En su prueba síncrona, la primera solicitud volvió después de los 20? Tal vez esto es más un problema en el lado del servidor, ¿qué tipo de servicio es esta llamada? –
@Mike Richard, mira mi enlace en la respuesta que publiqué, debería ayudarte. –