Não entendo completamente o que é o Node.js. Talvez seja porque eu sou principalmente um desenvolvedor de aplicativos de negócios baseado na Web. O que é e para que serve?
Até agora, meu entendimento é o seguinte:
- O modelo de programação é orientado a eventos, especialmente a forma como ele lida com I / O .
- Ele usa JavaScript e o analisador é V8 .
- Pode ser facilmente usado para criar aplicativos de servidor simultâneos.
Meus entendimentos estão corretos? Se sim, quais são os benefícios da E / S registrada, é apenas mais para o material de simultaneidade? Além disso, é a direção do Node.js para se tornar uma estrutura como o modelo de programação baseado em JavaScript (baseado em V8)?
fonte
Uso o Node.js no trabalho e considero muito poderoso. Forçado a escolher uma palavra para descrever o Node.js, eu diria "interessante" (que não é um adjetivo puramente positivo). A comunidade é vibrante e crescente. O JavaScript, apesar de suas peculiaridades, pode ser uma ótima linguagem para codificar. E você repensará diariamente sua própria compreensão das "melhores práticas" e dos padrões de código bem estruturado. Há uma enorme energia de idéias fluindo para o Node.js agora, e trabalhar nele expõe você a todo esse pensamento - excelente levantamento de peso mental.
O Node.js em produção é definitivamente possível, mas longe da implantação "pronta", aparentemente prometida pela documentação. Com o Node.js v0.6.x, o "cluster" foi integrado à plataforma, fornecendo um dos componentes essenciais, mas meu script "production.js" ainda possui ~ 150 linhas de lógica para lidar com coisas como criar o log diretório, reciclagem de trabalhadores mortos, etc. Para um serviço de produção "sério", você também precisa estar preparado para limitar as conexões de entrada e fazer tudo o que o Apache faz para PHP . Para ser justo, o Ruby on Rails tem esse problema exato . É resolvido através de dois mecanismos complementares: 1) Colocando Ruby nos Rails / Node.Apache / Lighttd ). O servidor da web pode servir com eficiência conteúdo estático, acessar log, reescrever URLs, encerrar SSL , impor regras de acesso e gerenciar vários sub-serviços. Para solicitações que atingem o serviço do nó real, o servidor da web realiza proxy da solicitação. 2) Usando uma estrutura como o Unicorn, que gerenciará os processos de trabalho, reciclá-los periodicamente, etc. Ainda não encontrei uma estrutura de serviço do Node.j que pareça totalmente preparada; pode existir, mas ainda não o encontrei e ainda uso ~ 150 linhas no meu "production.js" enrolado à mão.
Estruturas de leitura como o Express fazem parecer que a prática padrão é servir apenas tudo através de um serviço Node.js. de todos os tipos ... "app.use (express.static (__ dirname + '/ public'))" . Para serviços e desenvolvimento de carga menor, provavelmente isso é bom. Porém, assim que você tentar colocar um carregamento pesado em seu serviço e executá-lo 24 horas por dia, sete dias por semana, você descobrirá rapidamente as motivações que levam os sites a criar códigos C bem endurecidos e endurecidos, como o Nginx, na frente do site e na manipulação de todos os sites. das solicitações de conteúdo estático (... até você configurar uma CDN , como o Amazon CloudFront )). Para uma opinião um tanto humorística e descaradamente negativa, veja esse cara .
O Node.js também está encontrando cada vez mais usos não relacionados a serviços. Mesmo se você estiver usando outra coisa para veicular conteúdo da Web, ainda poderá usar o Node.js como uma ferramenta de construção, usando módulos npm para organizar seu código, Browserify para costurá-lo em um único ativo e uglify-js para minimizá- lo para implantação . Para lidar com a web, o JavaScript é uma correspondência perfeita de impedância e freqüentemente a torna a rota de ataque mais fácil. Por exemplo, se você deseja analisar várias cargas úteis de resposta JSON , deve usar meu módulo CLI de sublinhado , o cinto de utilidades dos dados estruturados.
Prós e contras:
Versus um modelo simples de um processo por solicitação ( LAMP ):
Contra escrever um serviço "real" em Java / C # / C (C? Sério?)
Para outra perspectiva sobre JavaScript e Node.js, confira De Java a Node.js , uma postagem no blog sobre as impressões e experiências de um desenvolvedor Java aprendendo o Node.js.
Módulos Ao considerar nó, tenha em mente que a sua escolha de bibliotecas JavaScript vai DEFINE sua experiência. A maioria das pessoas usa pelo menos dois, um auxiliar de padrão assíncrono (Step, Futures, Async) e um módulo de açúcar JavaScript ( Underscore.js ).
Auxiliar / JavaScript Sugar:
Módulos de padrão assíncrono:
Ou para ler tudo sobre as bibliotecas assíncronas, consulte esta entrevista em painel com os autores.
Estrutura da Web:
Teste:
Além disso, confira a lista oficial dos módulos Node.js. recomendados. No entanto, o Wiki de módulos de nós do GitHub é muito mais completo e um bom recurso.
Para entender o Node, é útil considerar algumas das principais opções de design:
O Node.js é BASEADO EM EVENTOS e ASSÍNCRONO / NÃO BLOQUEADO. Eventos, como uma conexão HTTP recebida, disparam uma função JavaScript que faz um pouco de trabalho e iniciam outras tarefas assíncronas, como conectar-se a um banco de dados ou extrair conteúdo de outro servidor. Depois que essas tarefas são iniciadas, a função de evento termina e o Node.js volta a dormir. Assim que outra coisa acontece, como a conexão do banco de dados sendo estabelecida ou o servidor externo respondendo ao conteúdo, as funções de retorno de chamada são acionadas e mais código JavaScript é executado, potencialmente iniciando ainda mais tarefas assíncronas (como uma consulta ao banco de dados). Dessa forma, o Node.js entrelaçará alegremente atividades para vários fluxos de trabalho paralelos, executando quaisquer atividades que sejam desbloqueadas a qualquer momento. É por isso que o Node.js faz um ótimo trabalho gerenciando milhares de conexões simultâneas.
Por que não usar apenas um processo / thread por conexão como todos os outros?No Node.js, uma nova conexão é apenas uma alocação de heap muito pequena. A ativação de um novo processo requer significativamente mais memória, um megabyte em algumas plataformas. Mas o custo real é a sobrecarga associada à alternância de contexto. Quando você tem 10 ^ 6 threads de kernel, o kernel precisa trabalhar bastante para descobrir quem deve executar a seguir. Um monte de trabalho foi dedicado à construção de um planejador O (1) para Linux, mas no final, é muito mais eficiente ter um único processo orientado a eventos do que 10 ^ 6 processos competindo pelo tempo da CPU. Além disso, sob condições de sobrecarga, o modelo de multiprocessos se comporta muito mal, passando por serviços críticos de administração e gerenciamento, especialmente SSHD (o que significa que você não pode nem entrar na caixa para descobrir como está realmente ferrado).
O Node.js é SINGLE THREADED e LOCK FREE . O Node.js, como uma opção de design muito deliberada, possui apenas um único encadeamento por processo. Por esse motivo, é fundamentalmente impossível que vários threads acessem dados simultaneamente. Portanto, nenhum bloqueio é necessário. Threads são difíceis. Realmente muito difícil. Se você não acredita nisso, não fez programação em threads suficiente. Acertar o bloqueio é difícil e resulta em erros realmente difíceis de rastrear. Eliminar bloqueios e multithreading faz com que uma das classes mais desagradáveis de bugs desapareça. Essa pode ser a maior vantagem do nó.
Mas como aproveito minha caixa de 16 núcleos?
Dois caminhos:
O Node.js permite que você faça coisas realmente poderosas sem suar a camisa. Suponha que você tenha um programa Node.js. que executa uma variedade de tarefas, ouve em umaporta TCP comandos, codifica algumas imagens, qualquer que seja. Com cinco linhas de código, você pode adicionar um portal de gerenciamento da Web baseado em HTTP que mostra o status atual das tarefas ativas. Isso é FÁCIL de fazer:
Agora você pode acessar um URL e verificar o status do seu processo em execução. Adicione alguns botões e você terá um "portal de gerenciamento". Se você possui um script Perl / Python / Ruby em execução, apenas "inserir um portal de gerenciamento" não é exatamente simples.
Mas o JavaScript não é lento / ruim / mal / cria-do-diabo? O JavaScript tem algumas esquisitices estranhas, mas com "as partes boas" existe uma linguagem muito poderosa e, de qualquer forma, o JavaScript é a linguagem do cliente (navegador). O JavaScript está aqui para ficar; outros idiomas o visam como uma IL, e talentos de classe mundial estão competindo para produzir os mais avançados mecanismos JavaScript. Devido ao papel do JavaScript no navegador, uma enorme quantidade de esforço de engenharia está sendo lançada para tornar o JavaScript extremamente rápido. V8é o melhor e mais recente mecanismo javascript, pelo menos para este mês. Ele impressiona as outras linguagens de script em eficiência e estabilidade (olhando para você, Ruby). E isso só vai melhorar com grandes equipes trabalhando no problema da Microsoft, Google e Mozilla, competindo para criar o melhor mecanismo JavaScript (não é mais um "intérprete" JavaScript, pois todos os mecanismos modernos fazem toneladas de JITcompilando sob o capô com interpretação apenas como um substituto para o código de execução única). Sim, todos nós desejamos poder corrigir algumas das opções mais estranhas da linguagem JavaScript, mas não é tão ruim assim. E a linguagem é tão flexível que você realmente não está codificando JavaScript, está codificando Step ou jQuery - mais do que qualquer outra linguagem, em JavaScript, as bibliotecas definem a experiência. Para criar aplicativos da Web, você precisa conhecer o JavaScript de qualquer maneira, portanto, a codificação no servidor tem uma espécie de sinergia de conjunto de habilidades. Isso me fez não temer escrever código de cliente.
Além disso, se você realmente odeia JavaScript, pode usar açúcar sintático como o CoffeeScript . Ou qualquer outra coisa que crie código JavaScript, como o Google Web Toolkit (GWT).
Falando em JavaScript, o que é um "fechamento"? - Uma maneira bastante elegante de dizer que você retém variáveis de escopo lexicamente nas cadeias de chamadas. ;) Como isso:
Veja como você pode simplesmente usar "myData" sem fazer nada de estranho, como esconder em um objeto? E, diferentemente do Java, a variável "myData" não precisa ser somente leitura. Esse poderoso recurso de linguagem torna a programação assíncrona muito menos detalhada e menos dolorosa.
Escrever código assíncrono sempre será mais complexo do que escrever um script simples de thread único, mas com o Node.js, não é muito mais difícil e você obtém muitos benefícios, além da eficiência e escalabilidade de milhares de conexões simultâneas. ..
fonte
V8 é uma implementação de JavaScript. Permite executar aplicativos JavaScript independentes (entre outras coisas).
O Node.js é simplesmente uma biblioteca escrita para a V8 que realiza E / S com eventos. Esse conceito é um pouco mais complicado de explicar, e tenho certeza que alguém responderá com uma explicação melhor do que eu ... O essencial é que, em vez de fazer alguma entrada ou saída e esperar que isso aconteça, você simplesmente não espera para terminar. Por exemplo, solicite a última hora editada de um arquivo:
Isso pode levar alguns milissegundos ou segundos. Com a E / S registrada, você simplesmente dispara a solicitação e, em vez de esperar, anexa um retorno de chamada que é executado quando a solicitação é concluída:
Isso se parece muito com o código JavaScript no navegador (por exemplo, com a funcionalidade de estilo Ajax ).
Para mais informações, você deve conferir o artigo Node.js é realmente empolgante, que foi minha introdução à biblioteca / plataforma ... Eu achei muito bom.
fonte
O Node.js é uma ferramenta de linha de comando de código aberto criada para o código JavaScript do servidor. Você pode baixar um tarball , compilar e instalar a fonte. Permite executar programas JavaScript.
O JavaScript é executado pelo V8 , um mecanismo JavaScript desenvolvido pelo Google, usado no navegador Chrome . Ele usa uma API JavaScript para acessar a rede e o sistema de arquivos.
É popular por seu desempenho e pela capacidade de executar operações paralelas.
A seguir estão alguns bons artigos sobre o assunto.
fonte
Os fechamentos são uma maneira de executar o código no contexto em que foi criado.
O que isso significa para concordância é que você pode definir variáveis, iniciar uma função de E / S sem bloqueio e enviar a ela uma função anônima para seu retorno de chamada.
Quando a tarefa estiver concluída, a função de retorno de chamada será executada no contexto com as variáveis, este é o fechamento.
O motivo pelo qual os fechamentos são tão bons para escrever aplicativos com E / S sem bloqueio é que é muito fácil gerenciar o contexto de funções executadas de forma assíncrona.
fonte
Dois bons exemplos são sobre como você gerencia modelos e usa aprimoramentos progressivos com ele. Você só precisa de algumas partes leves de código JavaScript para fazê-lo funcionar perfeitamente.
Eu recomendo fortemente que você assista e leia estes artigos:
Escolha qualquer idioma e tente se lembrar de como gerenciar seus modelos de arquivo HTML e o que você deve fazer para atualizar um único nome de classe CSS em sua estrutura DOM (por exemplo, um usuário clicou em um item de menu e você deseja que seja marcado como "selecionado" e atualize o conteúdo da página).
Com o Node.js, é tão simples quanto fazê-lo no código JavaScript do lado do cliente. Obtenha seu nó DOM e aplique sua classe CSS a isso. Obtenha seu nó DOM e internalHTML seu conteúdo (você precisará de algum código JavaScript adicional para fazer isso. Leia o artigo para saber mais).
Outro bom exemplo é que você pode tornar sua página da Web compatível com JavaScript ativado ou desativado com o mesmo trecho de código. Imagine que você tenha uma seleção de datas em JavaScript que permitiria que seus usuários selecionassem qualquer data usando um calendário. Você pode escrever (ou usar) o mesmo código JavaScript para fazê-lo funcionar com o JavaScript ativado ou desativado.
fonte
Existe uma analogia muito boa do local de fast food que melhor explica o modelo orientado a eventos do Node.js., consulte o artigo completo, Node.js., consultórios médicos e restaurantes de fast food - Compreendendo a programação orientada a eventos
Aqui está um resumo:
O Node.js é orientado a eventos, mas a maioria dos servidores Web é baseada em threads. O York explica como o Node.js funciona:
Você usa seu navegador da web para fazer uma solicitação para "/about.html" em um servidor da web Node.js.
O servidor Node.js. aceita sua solicitação e chama uma função para recuperar esse arquivo do disco.
Enquanto o servidor Node.js aguarda a recuperação do arquivo, ele atende à próxima solicitação da Web.
Quando o arquivo é recuperado, há uma função de retorno de chamada que é inserida na fila de servidores Node.js.
O servidor Node.js executa essa função que, nesse caso, renderiza a página "/about.html" e a envia de volta ao seu navegador da Web. "
fonte
Bem, eu entendo isso
Para mim, isso significa que você estava correto nas três suposições. A biblioteca parece promissora!
fonte
Além disso, não esqueça de mencionar que o V8 do Google é MUITO rápido. Na verdade, ele converte o código JavaScript em código de máquina com o desempenho correspondente do binário compilado. Então, junto com todas as outras grandes coisas, é incrivelmente rápido.
fonte
Q: O modelo de programação é orientado a eventos, especialmente a forma como ele lida com I / O .
Corrigir. Ele usa retornos de chamada, portanto, qualquer solicitação para acessar o sistema de arquivos faria com que uma solicitação fosse enviada ao sistema de arquivos e, em seguida, o Node.js começaria a processar sua próxima solicitação. Apenas se preocuparia com a solicitação de E / S quando receber uma resposta do sistema de arquivos, quando executará o código de retorno de chamada. No entanto, é possível fazer solicitações de E / S síncronas (ou seja, solicitações de bloqueio). Cabe ao desenvolvedor escolher entre assíncrono (retorno de chamada) ou síncrono (em espera).
P: Ele usa JavaScript e o analisador é V8.
sim
P: Pode ser facilmente usado para criar aplicativos de servidor simultâneos.
Sim, embora você precise codificar manualmente bastante JavaScript. Talvez seja melhor olhar para uma estrutura, como http://www.easynodejs.com/ - que vem com documentação on-line completa e um aplicativo de amostra.
fonte