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:

  1. O JavaScript executa seu código.
  2. O libuv leva as tarefas pesadas para o segundo plano.
  3. O JavaScript continua para a próxima linha.
  4. O libuv notifica o Event Loop quando a tarefa é concluída.
  5. 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.

Fonte: https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o