Introdução
Se você já ouviu falar de nó ou leu alguns artigos que afirmam o quão grande é o nó, você pode estar pensando: "O que exatamente é o nó?" Embora não seja para todos, o Node pode ser a escolha certa para algumas pessoas.
Para tentar explicar o que é node.js, este artigo explora os problemas que ele pode resolver, como funciona, como executar um aplicativo simples e, finalmente, quando o nó é e quando não é uma boa solução. Este artigo não cobre como escrever um aplicativo de nó complexo, nem é um tutorial abrangente de nós. A leitura deste artigo deve ajudá -lo a decidir se deve aprender o nó para usá -lo para o seu negócio.
Qual é o nó projetado para resolver?
O objetivo publicamente reivindicado de Node é "fornecer uma maneira simples de criar programas de rede escaláveis". Quais são os problemas com o programa de servidor atual? Vamos fazer um problema de matemática. Em idiomas como Java ™ e PHP, cada conexão gera um novo thread, que pode exigir 2 MB de memória complementar por novo thread. Em um sistema com 8 GB de RAM, o número máximo teórico de conexões simultâneas é de 4.000 usuários. À medida que sua base de clientes cresce, você deseja que seu aplicativo da Web ofereça suporte a mais usuários, para que você adicione mais servidores. Obviamente, isso aumenta os custos de negócios, especialmente os custos do servidor, custos de remessa e custos de mão -de -obra. Além desses aumentos de custos, há um problema técnico: os usuários podem usar servidores diferentes para cada solicitação, portanto, qualquer recurso compartilhado deve ser compartilhado entre todos os servidores. Por exemplo, em Java, variáveis estáticas e caches precisam ser compartilhados entre os JVMs em cada servidor. Este é o gargalo em toda a arquitetura de aplicativos da Web: o número máximo de conexões simultâneas que um servidor pode lidar.
A solução do nó para esse problema é alterar a maneira como a conexão se conecta ao servidor. Cada conexão cria um processo que não requer um bloco de memória complementar, em vez de gerar um novo thread para cada conexão (e alocar alguma memória complementar). O Node afirma que nunca será um impasse porque não permite bloqueios e não bloqueará diretamente as chamadas de E/S. O Node também afirma que o servidor em execução pode suportar dezenas de milhares de conexões simultâneas. De fato, o nó altera a face do servidor alterando gargalos em todo o sistema, desde o número máximo de conexões até o tráfego de um único sistema.
Agora que você tem um programa que pode lidar com dezenas de milhares de conexões simultâneas, o que você pode criar com o nó? Se você tem um aplicativo da Web que precisa lidar com tantas conexões, seria uma coisa "horrível"! Isso é um "Se você tem esse problema, não é um problema". Antes de responder à pergunta acima, vamos dar uma olhada em como o nó funciona e como ele foi projetado para funcionar.
O nó definitivamente não é
Sim, o Node é um programa de servidor. No entanto, certamente não se parece com Apache ou Tomcat. Esses servidores são produtos de servidor independente que permitem que os aplicativos sejam instalados e implantados imediatamente. Com esses produtos, você pode colocar um servidor em funcionamento em um minuto. O nó certamente não é esse tipo de produto. O Apache pode adicionar um módulo PHP para permitir que os desenvolvedores criem páginas dinâmicas da Web, e os programadores usando o TomCat podem implantar JSPs para criar páginas da Web dinâmica. O nó certamente não é esse tipo.
Nos estágios iniciais do nó (atualmente versão 0.4.6), não era um programa de servidor "pronto para uso" e você não pode instalá-lo, colocar arquivos nele e ter um servidor web totalmente funcional. Mesmo se você deseja implementar a função básica do servidor da Web em funcionamento após a conclusão da instalação, ainda é necessário muito trabalho.
Como funciona o nó
O próprio nó executa o JavaScript V8. Espere, JavaScript no servidor? É isso mesmo, você leu certo. O JavaScript do lado do servidor é um conceito relativamente novo mencionado há cerca de dois anos ao discutir o produto Aptana Jaxer no DeveloperWorks (consulte Recursos). Embora Jaxer nunca tenha sido realmente popular, o conceito em si não está fora de alcance - por que não podemos usar a linguagem de programação usada no cliente no servidor?
O que faz V8? O mecanismo JavaScript V8 é o mecanismo JavaScript subjacente que o Google usa para o navegador Chrome. Poucas pessoas pensam no que JavaScript realmente faz no cliente? De fato, o mecanismo JavaScript é responsável por interpretar e executar o código. Usando o V8, o Google criou um intérprete super rápido escrito em C ++ que possui outro recurso exclusivo; Você pode baixar o mecanismo e incorporá -lo a qualquer aplicativo. Não se limita a correr em um navegador. Portanto, o Node realmente usa o mecanismo JavaScript V8 escrito pelo Google e o reconstrói para uso no servidor. Muito perfeito! Agora que existe uma boa solução disponível, por que criar um novo idioma?
Programação orientada a eventos
Muitos programadores os educaram a acreditar que a programação orientada a objetos é o design de programação perfeito e exige outros métodos de programação. O Node usa o chamado modelo de programação orientado a eventos.
Listagem 1. Programação orientada a eventos usando jQuery no cliente
A cópia do código é a seguinte:
// Código jQuery no lado do cliente mostrando como funciona a programação orientada por eventos
// Quando um botão é pressionado, ocorre um evento - lide com ele
// diretamente bem aqui em uma função anônima, onde todo o
// As variáveis necessárias estão presentes e podem ser referenciadas diretamente
$ ("#mybutton"). Clique (function () {
if ($ ("#mytextfield"). val ()! = $ (this) .val ())
alerta ("o campo deve corresponder ao texto do botão");
});
De fato, não há diferença entre o servidor e o cliente. Sim, não há operação de clique de botão, nem há uma ação para digitar em um campo de texto, mas em um nível mais alto, o evento está acontecendo. Uma conexão é estabelecida - evento! Os dados são recebidos por meio de conexão - eventos! Os dados param através da conexão - evento!
Por que esse tipo de configuração é ideal para o nó? O JavaScript é uma ótima linguagem de programação orientada a eventos, pois permite funções e fechamentos anônimos e, mais importante, qualquer pessoa que tenha escrito o código esteja familiarizado com sua sintaxe. A função de retorno de chamada chamada quando ocorre um evento pode ser escrito no evento de captura. Dessa forma, o código é fácil de escrever e manter, sem estruturas complexas orientadas a objetos, sem interfaces e sem o potencial de estruturar nada nele. Basta ouvir o evento, escrever uma função de retorno de chamada e, em seguida, a programação orientada a eventos cuidará de tudo!
Aplicação do nó de amostra
Finalmente, vamos olhar para algum código! Vamos combinar tudo o que discutimos e criar nosso primeiro aplicativo de nó. Como já sabemos que o Node é ideal para lidar com aplicativos de alto tráfego, criaremos um aplicativo da Web muito simples - um aplicativo criado para a velocidade máxima. Aqui estão os requisitos específicos para o nosso aplicativo de amostra explicado por "Boss": Crie uma API RESTFUN GERATER RELATER GERATOR. Este aplicativo deve aceitar uma entrada: um parâmetro chamado "número". O aplicativo retorna um número aleatório entre 0 e o parâmetro e retorna o número gerado ao chamador. Como o "Boss" quer que seja um aplicativo amplamente popular, ele deve ser capaz de lidar com 50.000 usuários simultâneos. Vamos dar uma olhada no código:
Listagem 2. Nó gerador de números aleatórios
A cópia do código é a seguinte:
// Esses módulos precisam ser importados para usá -los.
// O nó possui vários módulos. Eles são como qualquer #include
// ou declaração de importação em outros idiomas
var http = requer ("http");
var url = requer ("url");
// A linha mais importante em qualquer arquivo de nó. Esta função
// faz o processo real de criação do servidor. Tecnicamente,
// nó diz ao sistema operacional subjacente que sempre que um
// A conexão é feita, esta função de retorno de chamada em particular deve ser
// executado. Como estamos criando um serviço da web com API REST,
// queremos um servidor HTTP, que requer a variável http
// criamos nas linhas acima.
// Finalmente, você pode ver que o método de retorno de chamada recebe uma 'solicitação'
// e objeto 'resposta' automaticamente. Isso deve ser familiar
// para qualquer programador PHP ou Java.
http.createServer (função (solicitação, resposta) {
// A resposta precisa lidar com todos os cabeçalhos e os códigos de retorno
// Esses tipos de coisas são tratados automaticamente em programas de servidor
// Como Apache e Tomcat, mas o nó exige que tudo seja feito
Response.writehead (200, {"content-type": "text/plana"});
// Aqui está algum código de aparência única. É assim que o nó se recupera
// parâmetros passados das solicitações do cliente. O módulo URL
// lida com todas essas funções. A função parse
// desconstrói o URL e coloca os valores-chave de consulta no
// Objeto de consulta. Podemos encontrar o valor da chave "número"
// referenciando -o diretamente - a beleza do JavaScript.
var params = url.parse (request.url, true) .Query;
var input = params.number;
// Estes são os métodos genéricos de JavaScript que criarão
// Nosso número aleatório que é passado de volta ao chamador
var numInput = novo número (entrada);
var numOutput = novo número (math.random () * numinput) .tofixed (0);
// Escreva o número aleatório para a resposta
Response.Write (numOutput);
// O nó exige que encerramos explicitamente essa conexão. Isso é porque
// O nó permite que você mantenha uma conexão aberta e passe dados para frente e para trás,
// Embora esse tópico avançado não seja discutido neste artigo.
resposta.END ();
// Quando criamos o servidor, precisamos conectar explicitamente o servidor HTTP a
// uma porta. A porta HTTP padrão é 80, então a conectaremos a essa.
}). Ouça (80);
// emitir uma string para o console quando o servidor é iniciado, informando -nos tudo
// inicia corretamente
console.log ("gerador de números aleatórios em execução ...");
Coloque o código acima em um arquivo chamado "Random.js". Agora, para iniciar o aplicativo e executá -lo (e crie um servidor HTTP e ouça as conexões na porta 80), basta inserir o seguinte comando no seu prompt de comando: % node random.js. Aqui está o que parece quando o servidor já está em funcionamento:
A cópia do código é a seguinte:
root@ubuntu:/home/moila/ws/mike# node aleatoriamente.js
Gerador de números aleatórios em execução ...
Acesse o aplicativo
O aplicativo está em funcionamento. O Node está ouvindo qualquer conexão, vamos testá -la. Como criamos uma API RESTful simples, podemos usar nosso navegador da web para acessar este aplicativo. Digite o seguinte endereço (certifique -se de concluir as etapas acima): http: // localhost/? Número = 27.
A janela do seu navegador mudará para um número aleatório entre 0 e 27. Clique no botão Recarregar no seu navegador e você receberá outro número aleatório. É isso, este é o seu primeiro aplicativo de nó!
Para que serve o nó?
Até agora, você deve poder responder à pergunta "o que é o nó", mas pode não ficar claro quando deve usá -la. Esta é uma pergunta importante a ser feita, porque o nó é bom para algumas coisas, mas, por outro lado, o nó pode não ser uma boa solução para os outros no momento. Você precisa ter cuidado para decidir quando usar o nó, pois usá -lo na situação errada pode resultar em um lote codificado redundante.
Para que serve isso?
Como você viu antes, o Node é perfeito para situações em que você espera ter tráfego alto, e os requisitos de lógica e processamento do lado do servidor não são necessariamente enormes antes de responder ao cliente. Exemplos típicos do excelente desempenho do Node incluem:
1. API restante
Um serviço da Web que fornece a API RESTful recebe vários parâmetros, os analisa, combina uma resposta e retorna uma resposta (geralmente menos texto) ao usuário. Esta é a situação ideal para o nó, pois você pode construí -lo para lidar com dezenas de milhares de conexões. Ainda não requer muita lógica; Ele apenas procura alguns valores de um banco de dados e combina uma resposta. Como a resposta é uma pequena quantidade de texto e uma pequena quantidade de texto em solicitações de entrada, o tráfego não é alto e uma máquina pode lidar com as necessidades da API das empresas mais movimentadas.
2. Twitter Fila
Imagine uma empresa como o Twitter, que precisa receber tweets e escrevê -los em um banco de dados. De fato, quase milhares de tweets são atingidos por segundo, e é impossível para o banco de dados processar o número de gravações necessárias durante os períodos de pico em tempo hábil. O nó se tornou uma parte importante da solução para esse problema. Como você pode ver, o nó pode lidar com dezenas de milhares de tweets de entrada. Ele os grava rápida e facilmente em um mecanismo de fila de memória (por exemplo, memcached), onde outro processo separado pode grave -los no banco de dados. O papel do Node aqui é coletar rapidamente tweets e passar essas informações para outro processo responsável pela escrita. Imagine outro design - um servidor PHP regular tenta lidar com a gravação no próprio banco de dados - cada tweet causará um breve atraso ao gravar no banco de dados, porque a chamada do banco de dados está bloqueando o canal. Devido à latência do banco de dados, uma máquina projetada como essa pode lidar apenas com 2000 tweets de entrada por segundo. 1 milhão de tweets por segundo requer 500 servidores. Em vez disso, o nó lida com todas as conexões sem bloquear o canal, capturando o maior número possível de tweets. Uma máquina de nós que pode lidar com 50.000 tweets requer apenas 20 servidores.
3. Servidor de arquivos de imagem
Uma empresa com grandes sites distribuídos, como Facebook ou Flickr, pode decidir usar todas as máquinas apenas para imagens de serviço. O nó seria uma boa solução para esse problema, pois a empresa pode usá -lo para escrever um retriever de arquivo simples e, em seguida, processar dezenas de milhares de conexões. O nó procurará o arquivo de imagem, retornará o arquivo ou um erro 404 e depois não fará nada. Essa configuração permitirá que esses sites distribuídos reduzam o número de servidores necessários para servir arquivos estáticos, como imagens, arquivos .js e .css.
Para que é ruim?
Obviamente, em alguns casos, o nó não é ideal. Aqui estão as áreas em que o nó não é bom:
1. Páginas criadas dinamicamente
Atualmente, o Node não fornece um método padrão para criar páginas dinâmicas. Por exemplo, ao usar a tecnologia JavaServer Pages (JSP), você pode criar uma página Index.jsp que contém um loop em um trecho de código JSP. O nó não suporta páginas dinâmicas e orientadas por HTML. Da mesma forma, o Node não é muito adequado como um servidor da Web como Apache e Tomcat. Portanto, se você deseja fornecer uma solução do lado do servidor no nó, você mesmo deve escrever a solução inteira. Os programadores PHP não querem escrever um conversor PHP para o Apache toda vez que implantam um aplicativo da Web e, até agora, é exatamente isso que o Node pede que você faça.
2. Aplicações pesadas de banco de dados relacionais
O objetivo do nó é rápido, assíncrono e não bloqueador. Os bancos de dados não compartilham necessariamente esses objetivos. Eles são síncronos e bloqueadores, porque as chamadas para o banco de dados durante a leitura e a gravação bloquearão o canal até que o resultado seja gerado. Portanto, um aplicativo da Web que requer muitas chamadas de banco de dados, muitas leituras, muitas gravações por solicitação é muito inadequada para o nó, porque o próprio banco de dados relacional pode compensar as muitas vantagens do nó. (O novo banco de dados NoSQL é mais adequado para o nó, mas esse é outro tópico.)
Conclusão
A questão é "o que é node.js?" deveria ter sido respondido. Depois de ler este artigo, você poderá responder a essa pergunta em algumas frases claras e concisas. Nesse caso, você chegou à vanguarda de muitos codificadores e programadores. Eu falei sobre nó com muitas pessoas, mas elas ficaram confusas sobre o que exatamente é o nó. Compreensivelmente, eles têm a mentalidade do Apache - um servidor é um aplicativo que coloca os arquivos HTML nela e tudo funcionará corretamente. E o nó é orientado para o propósito. É um programa de software que usa o JavaScript para permitir que os programadores criem de maneira fácil e rápida e rápida e escalável servidores da Web. O Apache está pronto para ser executado, enquanto o Node está codificando pronto para ser executado.
O nó atinge seu objetivo de fornecer um servidor altamente escalável. Em vez de alocar um modelo "um thread por conexão", ele usa um modelo "um processo por conexão" para criar apenas a memória necessária para cada conexão. Ele usa um mecanismo JavaScript muito rápido do Google: o mecanismo V8. Ele usa um design orientado a eventos para manter o código mínimo e fácil de ler. Todos esses fatores contribuem para o objetivo ideal do nó - é mais fácil escrever uma solução altamente escalável.
Tão importante quanto entender o que é o nó, entender o que não é. O nó não substitui o Apache, projetado para tornar os aplicativos da Web PHP mais escaláveis. Este é realmente o caso. Nesse estágio inicial do nó, é improvável que um grande número de programadores o use, mas em cenários onde funciona, ele tem um desempenho muito bom.
O que devo esperar do nó no futuro? Esta é talvez a questão mais importante que este artigo traz à tona. Agora que você sabe o que faz agora, deve estar se perguntando o que fará a seguir. No ano seguinte, estou ansioso para que o Node, fornecendo melhor integração com as bibliotecas de suporte de terceiros existentes. Muitos programadores de terceiros agora desenvolveram plug-ins para o nó, incluindo a adição de suporte ao servidor de arquivos e suporte ao MySQL. Esperançosamente, o Node começa a integrá -los à sua funcionalidade principal. Por fim, também quero que o Node suportasse algum tipo de módulo de página dinâmica, para que você possa fazer o que faz no PHP e JSP (talvez um NSP, uma página do servidor do Node) no arquivo HTML. Finalmente, espero que um dia um servidor de nó "pronto para implantação" apareça, que pode ser baixado e instalado, basta colocar seus arquivos HTML nele, assim como o uso do Apache ou Tomcat. O Node ainda está em seus estágios iniciais, mas está se desenvolvendo muito rapidamente e em breve estará em sua visão.