Como o Node.js lida com milhares de requisições
Dizem que o Node.js é single-threaded.
No entanto, ele lida com milhares de requisições, lê arquivos e faz chamadas de API sem parar.
Como isso funciona?
A resposta é o libuv.
O libuv é uma biblioteca em C. Ele fornece ao Node.js capacidades de I/O assíncronas e não bloqueantes. O JavaScript não consegue ler arquivos ou gerenciar sockets de rede por conta própria. O Node.js usa o libuv para se comunicar com o seu sistema operacional.
Sem o libuv, o JavaScript pararia toda vez que você lesse um arquivo. Seu aplicativo ficaria sem resposta.
Com o libuv, a leitura do arquivo ocorre em segundo plano. O JavaScript continua executando outro código.
Exemplo:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Saída: Start End (conteúdo do arquivo)
O Node.js imprime "End" antes de o arquivo terminar de ser lido. Ele não espera.
Como o libuv gerencia seu código:
• The Event Loop: o libuv executa o loop que verifica se as tarefas foram concluídas. Ele coloca os callbacks em uma fila quando as tarefas terminam. • Thread Pool: o JavaScript usa uma única thread. O libuv usa um pool de threads de trabalho. Por padrão, este pool possui 4 threads. Essas threads lidam com tarefas pesadas como:
- Operações de sistema de arquivos
- Buscas de DNS
- Compressão
- Criptografia • Networking: o libuv gerencia sockets HTTP, TCP e UDP. Isso permite que os servidores lidem com muitas conexões ao mesmo tempo. • Timers: o libuv lida com setTimeout e setInterval.
O fluxo de execução funciona assim:
- O JavaScript executa seu código.
- O libuv leva as tarefas pesadas para o segundo plano.
- O JavaScript continua para a próxima linha.
- O libuv notifica o Event Loop quando a tarefa é concluída.
- O Event Loop executa seu callback.
Pense em uma pizzaria.
Sem o libuv, você fica no balcão e pergunta "Minha comida está pronta?" a cada dez segundos. Você bloqueia a fila.
Com o libuv, você faz o pedido, senta e espera por uma notificação. Você fica livre para fazer outras coisas até que a pizza esteja pronta.
Resumo:
• Execução do JavaScript: V8 Engine • Event Loop: libuv • I/O de Arquivo: libuv • Rede: libuv • Timers: libuv
O libuv é o motor que mantém o Node.js rápido.
