Servidor HTTP multithread com ThreadPool e State Machine

Hoje vou falar sobre uma implementação bastante simples, mas interessante, de multithreading em um servidor HTTP sem criar uma thread para cada cliente. Para minha surpresa, dificilmente encontrei informações sobre tal implementação, então decidi compartilhar com vocês. Vamos começar com uma descrição do problema.





Problemas de solução "one thread = one client"

Os problemas descritos abaixo são verdadeiros para threads e processos, portanto, "um thread = um cliente" também pode ser considerado como "um processo, um cliente" neste contexto.





O primeiro problema é que o número de threads que podem ser criados em um programa é limitado. Como resultado, o número de usuários conectados ao nosso servidor também é limitado. O Apache tem esse problema, por exemplo.





O segundo problema é que um thread é ocupado por apenas um cliente. Nesse sentido, obtemos um uso ineficiente de recursos. (o thread pode ficar ocioso enquanto espera por um evento do cliente)





Além de tudo isso, você precisa entender que criar um thread (ou processo) é uma operação bastante difícil e às vezes requer mais custos do que o próprio serviço ao cliente.





A solução que ofereço abaixo elimina esses problemas.





Existe uma solução

, . ( , , , , ).





, . , , . , , .





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





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





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





. , , :)





. , .





ThreadPool ( )

. ( , ) .





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





, " = " . ( ) , ( ).





, . , , :)





, , , , , .





Desta vez, apenas delineei a essência da abordagem. Se você está interessado em ver a continuação do artigo já com a parte prática (abordagens para implementação e suas armadilhas) - me avise :)





Isso é tudo. Compartilhe suas opções, sugestões, acréscimos e críticas nos comentários! Obrigado por ler :)





Vários links úteis:





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





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





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








All Articles