Serveur HTTP multithread avec ThreadPool et State Machine

Aujourd'hui, je vais vous parler d'une implémentation assez simple mais intéressante du multithreading dans un serveur HTTP sans créer de thread pour chaque client. À ma grande surprise, j'ai à peine trouvé des informations sur une telle implémentation, j'ai donc décidé de les partager avec vous. Commençons par une description du problème.





Problèmes de la solution "un thread = un client"

Les problèmes décrits ci-dessous sont vrais pour les threads et les processus, donc "un thread = un client" peut également être considéré comme "un processus, un client" dans ce contexte.





Le premier problème est que le nombre de threads pouvant être créés dans un programme est limité. En conséquence, le nombre d'utilisateurs connectés à notre serveur est également limité. Apache a un tel problème, par exemple.





Le deuxième problème est qu'un thread est occupé par un seul client. À cet égard, nous obtenons une utilisation inefficace des ressources. (le thread peut être inactif pendant qu'il attend un événement du client)





En plus de tout cela, vous devez comprendre que la création d'un thread (ou d'un processus) est une opération plutôt difficile, et parfois elle nécessite plus de coûts que le service client lui-même.





La solution que je propose ci-dessous résout ces problèmes.





Il y a une solution

, . ( , , , , ).





, . , , . , , .





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





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





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





. , , :)





. , .





ThreadPool ( )

. ( , ) .





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





, " = " . ( ) , ( ).





, . , , :)





, , , , , .





Cette fois, je viens de décrire l'essence de l'approche. Si vous êtes intéressé à voir la suite de l'article déjà avec la partie pratique (approches de mise en œuvre et leurs pièges) - faites-le moi savoir :)





C'est tout. Partagez vos options, suggestions, ajouts et critiques dans les commentaires! Merci d'avoir lu :)





Plusieurs liens utiles:





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





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





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








All Articles