Servidores WEB: como é possível receberem vários pedidos?
Por omissão, os servidores WEB usam o porto lógico 80 (HTTP) ou 443 (HTTPS). No entanto, há quem se questione sobre o seguinte: se só tem um porto lógico, como conseguem receber vários pedidos em simultâneo?
Os servidores WEB/HTTP funcionam por omissão no porto 80 (HTTP) ou no porto 443 (HTTPS). No entanto, o administrador do sistema pode configurar o serviço para este funcionar em qualquer porto, sendo que nesse momento o serviço/página WEB é acessível usando o endereço da seguinte forma: <endereço_maquina>:<porto_maquina> (exemplo: https://pplware.sapo.pt:85).
Mas considerando que o nosso servidor apenas está configurado para receber pedidos no porto 80, como trata ele pedidos em simultâneo, deixando que o porto 80 esteja sempre livre para receber novos pedidos?
Os servidores web conseguem receber vários pedidos simultâneos através de um processo chamado concorrência. Existem diversas técnicas que permitem aos servidores lidar com múltiplos pedidos ao mesmo tempo.
Técnicas usadas por servidores Web para receber vários pedidos
1. Multithreading (Multithreads)
O servidor web pode criar múltiplas threads (linhas de execução) para tratar de diferentes pedidos. Cada pedido é processado por uma thread separada. Isso permite que vários pedidos sejam tratados de forma independente e simultânea, garantindo uma resposta mais rápida para cada cliente.
2. Multiprocessamento
Em vez de usar threads, alguns servidores criam múltiplos processos para lidar com os pedidos. Cada processo é independente e pode lidar com um ou mais pedidos. O sistema operativo gere a alocação de recursos entre os processos.
3. Assíncrono (I/O Assíncrono)
O servidor pode ser baseado em I/O assíncrono, onde, em vez de bloquear enquanto aguarda operações como leitura ou escrita de dados, o servidor continua a tratar outros pedidos.
Quando os dados estão prontos, o servidor volta a processar o pedido correspondente. Este modelo é muito eficiente para tratar grandes volumes de pedidos, especialmente quando estes envolvem tempo de espera (e.g., a aguardar resposta de uma base de dados ou outro serviço).
4. Modelo Baseado em Eventos (Event-driven)
Servidores como o Node.js utilizam um único loop de eventos para gerir muitos pedidos simultaneamente. Este loop trata um pedido de cada vez, mas de forma extremamente rápida, passando para o próximo pedido assim que o trabalho necessário é delegado (por exemplo, operações de leitura de ficheiros ou chamadas de bases de dados), e retorna a ele quando os resultados estão prontos.
5. Balanceamento de Carga (Load Balancing)
Para grandes aplicações, os pedidos podem ser distribuídos entre múltiplos servidores através de um balanceador de carga. Este dispositivo ou software distribui os pedidos recebidos por diferentes servidores, garantindo que nenhum deles fica sobrecarregado. Assim, o sistema consegue escalar horizontalmente, aumentando a capacidade de lidar com mais pedidos ao adicionar mais servidores à rede.
6. Fila de Pedidos (Queueing)
Em algumas situações, pode ser usada uma fila de pedidos. O servidor recebe os pedidos e coloca-os numa fila para serem processados à medida que os recursos ficam disponíveis. Esse modelo é útil para sistemas com restrições de capacidade, onde o número de pedidos pode exceder momentaneamente os recursos disponíveis.
7. Caching
Para reduzir a carga de processamento e acelerar a resposta, os servidores podem armazenar em cache os resultados de pedidos frequentes. Assim, se um mesmo pedido for feito várias vezes, o servidor pode responder rapidamente com a versão em cache, sem ter que reprocessar a solicitação.
Em resumo, os servidores web utilizam técnicas de concorrência, seja através de threads, processos, ou modelos assíncronos, combinados com otimizações como caching e balanceamento de carga, para receber e responder a múltiplos pedidos ao mesmo tempo, de forma eficiente e escalável.