Servidor HTTP multiproceso con ThreadPool y State Machine

Hoy les hablaré sobre una implementación bastante simple pero interesante de multihilo en un servidor HTTP sin crear un hilo para cada cliente. Para mi sorpresa, apenas encontré información sobre tal implementación, así que decidí compartirla con ustedes. Comencemos con una descripción del problema.





Problemas de la solución "un hilo = un cliente"

Los problemas que se describen a continuación son ciertos tanto para subprocesos como para procesos, por lo que "un subproceso = un cliente" también se puede considerar como "un proceso, un cliente" en este contexto.





El primer problema es que la cantidad de subprocesos que se pueden crear en un programa es limitada. Como resultado, el número de usuarios conectados a nuestro servidor también es limitado. Apache tiene ese problema, por ejemplo.





El segundo problema es que un hilo está ocupado por un solo cliente. En este sentido, obtenemos un uso ineficiente de los recursos. (el hilo puede estar inactivo mientras espera un evento del cliente)





Además de todo esto, debe comprender que crear un hilo (o proceso) es una operación bastante difícil y, a veces, requiere más costos que el servicio al cliente en sí.





La solución que proporciono a continuación cierra estos problemas.





hay una solucion

, . ( , , , , ).





, . , , . , , .





, , . (, ) , . , . , , .





. . : readRequest, generateResponse, sendResponse closeConnection ( , , , ). . readRequest , (, , ), generateResponse, closeConnection. generateResponse sendResponse. sendResponse readRequest, closeConnection. closeConnection, , .





. ( : ) . , . readRequest - parsingRequest, .





. , , :)





. , .





ThreadPool ( )

. ( , ) .





: . , , . ( - ) , , « , », ( , ). , , , . . - .





, " = " . ( ) , ( ).





, . , , :)





, , , , , .





Esta vez solo describí la esencia del enfoque. Si está interesado en ver la continuación del artículo ya con la parte práctica (enfoques para la implementación y sus dificultades), hágamelo saber :)





Eso es todo. ¡Comparte tus opciones, sugerencias, adiciones y críticas en los comentarios! Gracias por leer :)





Varios enlaces útiles:





https://habr.com/ru/post/260065/





https://habr.com/ru/company/latera/blog/273283/





http://www.aosabook.org/en/nginx.html








All Articles