Una vez escribí un rastreador en .NET. Para mejorar su escalabilidad, traté de aprovechar la API asíncrona de .NET..NET NO tiene una comunicación de socket Asynchronouos confiable?
La System.Net.HttpWebRequest tiene la API asincrónica BeginGetResponse/EndGetResponse. Sin embargo, este par de API es solo para obtener un encabezado de respuesta HTTP y una instancia de Stream a partir de la cual podemos extraer el contenido de respuesta HTTP. Entonces, mi estrategia es usar BeginGetResponse/EndGetResponse para obtener de manera asincrónica el Stream de respuesta, luego usar BeginRead/EndRead para obtener asincrónicamente bytes de la instancia Stream de respuesta.
Todo parece perfecto hasta que el Crawler pase a la prueba de esfuerzo. En prueba de esfuerzo, el Crawler sufre un uso elevado de memoria. Comprobé la memoria con WinDbg + SoS y descubrí que muchas de las matrices de bytes son creadas por las instancias System.Threading.OverlappedData. Después de buscar en internet, encontré esta KB http://support.microsoft.com/kb/947862 de microsoft.
De acuerdo con la KB, el número de E/S asíncronas debe tener un "límite superior", pero no indica un valor límite "sugerido". Entonces, en mi opinión, esta KB no ayuda en nada. Esto es obviamente un error de .NET. Finalmente, tengo que descartar la idea de hacer bytes de extracción asíncrona de Stream de respuesta, y simplemente hacerlo de forma síncrona.
La biblioteca .NET que permite asíncrono IO con tomas red del punto (Socket.BeginSend/ Socket.BeginReceive/ NetworkStream.BeginRead/ NetworkStream.BeginWrite) debe tener un límite superior de la cantidad de buffers pendientes (ya sea enviar o recibir) con su IO asincrónico.
aplicación de la red debe tener una límite superior del número de excepcional S asíncrona que mensajes.
Editar: Agregar algunos signos de interrogación.
¿Alguien tiene alguna experiencia para hacer E/S asincrónicas en el zócalo & NetworkStream? Hablando en general, ¿el rastreador en producción hace E/S con internet con Synchronous o Asynchronosly?
No hay un solo signo de interrogación, excepto en el asunto ... Una mala señal. –