Sobre Node.js®

Como um ambiente de execução JavaScript assíncrono orientado a eventos, o Node.js é projetado para desenvolvimento de aplicações escaláveis de rede. No exemplo a seguir, diversas conexões podem ser controladas ao mesmo tempo. Em cada conexão a função de callback é chamada. Mas, se não houver trabalho a ser realizado, o Node.js ficará inativo.

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Essa é uma alternativa que contrasta com o modelo de concorrência mais comum, onde são utilizadas threads do SO. Aplicações de rede baseadas em threads são relativamente ineficientes e difíceis de usar. Além disso, os usuários do Node.js não precisam se preocupar com deadlock de processos, pois não existem locks. Quase nenhuma função no Node.js realiza diretamente operações de E/S, por essa razão o processo nunca bloqueia. Por não existirem operações bloqueantes, sistemas escaláveis são razoavelmente fáceis de serem desenvolvidos em Node.js.

Se algum desses conceitos não é familiar, dê uma olhada no artigo Blocking vs Non-Blocking.


Node.js é semelhante no projeto, e influenciado por sistemas como Event Machine do Ruby ou Twisted do Python. Porém, leva o modelo de eventos um pouco mais além. No Node.js o event loop é exposto como uma parte do ambiente de execução ao invés de uma biblioteca. Em outros sistemas há sempre uma chamada bloqueante para iniciar o event-loop. Tipicamente o comportamento esperado é definido através de callbacks no início do script, e no final um servidor é iniciado por uma chamada bloqueante como por exemplo EventMachine::run().

Em Node.js, HTTP é um cidadão de primeira classe, projetado para que tenha um alta taxa de fluxo e baixa latência. Isso torna o Node.js uma ótima escolha para servir como base para uma biblioteca web ou para um framework.

Embora Node.js seja projetado sem a utilização de threads, isso não quer dizer que você não possa tirar vantagens de múltiplos núcleos de processamento em seu ambiente. Processos filhos podem ser criados utilizando a API child_process.fork(), e foram desenvolvidos para que a comunicação entre eles seja fácil. Da mesma maneira foi o módulo cluster, que permite o compartilhamento de sockets entre os processos, a fim de permitir o balanceamento de carga entre os núcleos.

Retorne ao começo