Introdução ao Node.js

Node.js possui algumas características que o tornam bastante peculiar, mas uma das mais importantes é o fato de que todas as conexões feitas ao servidor compartilham a mesma thread.

Isso significa que, se o servidor estiver lidando com mil conexões simultaneamente, uma única thread é responsável por gerir todas as mil conexões.

Desse modo, o servidor pode lidar com várias conexões simultaneamente, utilizando uma quantidade de memória RAM não muito maior do que utilizaria com apenas uma conexão, diferente do que acontece com PHP, por exemplo.

Alguém com um conhecimento básico em threads pode ter percebido que isso também trás algumas limitações.

Como o servidor só pode suprir uma conexão por vez, se uma conexão precisar fazer operações lentas, como cálculos matemáticos pesados ou o redimensionamento de imagens grandes, deixando o servidor ocupado, nenhuma outra conexão conseguirá ser atendida. Por esse motivo, as requisições feitas devem ser atendidas processadas rapidamente!

Operações de I/O, como acesso a banco de dados ou a servidores externos, são realizadas de maneira assíncrona, como requisições Ajax convencionais. Essas operações são coordenadas por threads separadas, mas uma vez que todos os dados foram obtidos, eles são passados para a thread principal através de uma função de callback. Desse modo, enquanto uma thread busca os dados de um post do blog no banco de dados, um trecho de outra conexão pode ser processado.

Além disso, Node.js é ideal para o desenvolvimento de aplicações que respondam a eventos em tempo real, como um chat. Quando um usuário envia uma mensagem em uma sala de bate-papo, é razoável esperar que todos os membros da sala recebam a mensagem no mesmo instante.

Um programador pouco experiente poderia pensar em implementar isso fazendo requisições ajax para o servidor constantemente, verificando a existência de novas mensagens (já aconteceu comigo!). O problema é que isso provocaria uma carga enorme no servidor. Na verdade, com um número não muito grande de usuários, o efeito seria bem parecido com o de um ataque DDOS.

Para resolver esse problema, ao invés de se criar constantemente novas conexões entre cada cliente e o servidor, cria-se apenas uma conexão (por cliente), que permanece aberta o tempo todo. Através dessa conexão, cliente e servidor podem trocar mensagens de maneira extremamente rápida.

Da maneira tradicional, para transmissão de informações pequenas, perde-se muito mais tempo para o estabelecimento de novas conexões do que transmitindo a mensagem. Se sentir necessidade, o leitor pode se informar mais sobre HTTP e TCP.

Já com conexões persistentes, a conexão é estabelecida apenas uma vez, e sempre que preciso, as mensagens podem ser enviadas através dela.

Não acrescentarei nada de programação neste post, pois ele já está demasiadamente grande, mas espero em breve postar algumas linhas de código :)

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *