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.