¿Cómo se minimiza la cantidad de subprocesos utilizados en una aplicación de servidor TCP?

StackOverflow https://stackoverflow.com/questions/32198

Pregunta

Estoy buscando estrategias que la gente utilice al implementar aplicaciones de servidor que atiendan las solicitudes TCP (o UDP) del cliente:Patrones de diseño, técnicas de implementación, mejores prácticas, etc.

A los efectos de esta pregunta, supongamos que las solicitudes tienen una duración relativamente larga (varios minutos) y que el tráfico es sensible al tiempo, por lo que no se aceptan retrasos en la respuesta a los mensajes.Además, atendemos las solicitudes de los clientes y realizamos nuestras propias conexiones a otros servidores.

Mi plataforma es .NET, pero como la tecnología subyacente es la misma independientemente de la plataforma, me interesa ver respuestas para cualquier idioma.

¿Fue útil?

Solución

El enfoque moderno es hacer uso del sistema operativo para multiplexar muchos sockets de red, liberando su aplicación para que solo procese conexiones activas con tráfico.

Cada vez que abres un socket, se asocia con un selector.Utiliza un solo hilo para sondear ese selector.Cada vez que llegan datos, el selector indicará el socket que está activo, usted entrega esa operación a un subproceso secundario y continúa sondeando.

De esta manera sólo necesitas un hilo para cada operación simultánea.Los enchufes que están abiertos pero inactivos no atarán un hilo.

Otros consejos

Un enfoque más sofisticado sería utilizar puertos de finalización de IO.(Ventanas) Con los puertos de finalización de E/S, se deja que el sistema operativo administre el sondeo, lo que le permite usar potencialmente un nivel muy alto de optimización con compatibilidad con controladores NIC.Básicamente, tiene una cola de operaciones de red administrada por el sistema operativo y proporciona una función de devolución de llamada que se llama cuando se completa la operación.Un poco como DMA (disco duro) pero para red.

Len Holgate escribió una excelente serie sobre puertos de finalización de IO hace unos años en Codeproject:http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

Y Encontré un artículo sobre puertos de finalización de E/S para .net (aunque no lo he leído) http://www.codeproject.com/KB/cs/managediocp.aspx

También diría que es fácil usar puertos de finalización en comparación con intentar escribir una alternativa escalable.El problema es que sólo están disponibles en NT (2000, XP, Vista)

Si estaba usando C++ y Win32 directamente, le sugiero que lea sobre los puertos de E/S superpuestos y de finalización de E/S.Tengo un marco cliente/servidor C++, IOCP, gratuito con el código fuente completo, consulte aquí para más detalles.

Dado que está utilizando .Net, debería considerar el uso de métodos de socket asíncronos para no necesitar un subproceso para cada conexión;Hay varios enlaces de esta publicación mía que pueden ser puntos de partida útiles: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (¡algunos de los mejores enlaces se encuentran en los comentarios de la publicación original!)

Buen día,

Comenzaría mirando la metáfora que quieres usar para tu marco de subprocesos.

Tal vez "seguidor líder" donde un hilo escucha las solicitudes entrantes y cuando llega una nueva solicitud, hace el trabajo y el siguiente hilo en el grupo comienza a escuchar las solicitudes entrantes.

O un grupo de subprocesos donde el mismo subproceso siempre escucha las solicitudes entrantes y luego pasa las solicitudes al siguiente subproceso disponible en el grupo de subprocesos.

Quizás le interese visitar el Reactor sección de Componentes de Ace para obtener algunas ideas.

HTH.

Bien Robar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top