Multithread-HTTP-Server mit ThreadPool und State Machine

Heute werde ich Ihnen von einer ziemlich einfachen, aber interessanten Implementierung von Multithreading auf einem HTTP-Server erzählen, ohne für jeden Client einen Thread zu erstellen. Zu meiner Überraschung habe ich kaum Informationen über eine solche Implementierung gefunden, deshalb habe ich beschlossen, sie mit Ihnen zu teilen. Beginnen wir mit einer Beschreibung des Problems.





Probleme der Lösung "Ein Thread = Ein Client"

Die unten beschriebenen Probleme gelten sowohl für Threads als auch für Prozesse. Daher kann "ein Thread = ein Client" in diesem Zusammenhang auch als "ein Prozess, ein Client" betrachtet werden.





Das erste Problem ist, dass die Anzahl der Threads, die in einem Programm erstellt werden können, begrenzt ist. Infolgedessen ist auch die Anzahl der mit unserem Server verbundenen Benutzer begrenzt. Apache hat zum Beispiel ein solches Problem.





Das zweite Problem ist, dass ein Thread nur von einem Client belegt wird. In dieser Hinsicht erhalten wir einen ineffizienten Ressourceneinsatz. (Der Thread kann inaktiv sein, während er auf ein Ereignis vom Client wartet.)





Darüber hinaus müssen Sie verstehen, dass das Erstellen eines Threads (oder Prozesses) ein ziemlich schwieriger Vorgang ist und manchmal mehr Kosten erfordert als der Kundendienst selbst.





Die Lösung, die ich unten anbiete, schließt diese Probleme.





Es gibt eine Lösung

, . ( , , , , ).





, . , , . , , .





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





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





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





. , , :)





. , .





ThreadPool ( )

. ( , ) .





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





, " = " . ( ) , ( ).





, . , , :)





, , , , , .





Dieses Mal habe ich nur die Essenz des Ansatzes skizziert. Wenn Sie daran interessiert sind, die Fortsetzung des Artikels bereits mit dem praktischen Teil (Implementierungsansätze und ihre Fallstricke) zu sehen - lassen Sie es mich wissen :)





Das ist alles. Teilen Sie Ihre Optionen, Vorschläge, Ergänzungen und Kritik in den Kommentaren! Danke fürs Lesen :)





Mehrere nützliche Links:





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





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





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








All Articles