Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login

Programação assíncrona com Node.js

Boas práticas relativas ao desenvolvimento assíncrono em JavaScript, usando Node.js. Veremos desde os conceitos da tecnologia, as aplicações, como se acopla ao JavaScript, assim como o desenvolvimento do código referente ao assincronismo

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (14)  (0)

Fique por dentro
Quando se trata de desenvolvimento front-end, o Node.js é disparado uma das tecnologias que mais intrigam e impressionam a comunidade de desenvolvimento, por suas várias características fundamentais, como poder usar JavaScript no servidor, bem como o papel que ele exerce nessa comunicação.

Para o leitor que já está familiarizado com JavaScript, Node.js é só mais um curto passo ao aprendizado. Neste artigo veremos desde conceitos de configuração, ambiente, características, posicionamento atual, até o as vantagens da programação assíncrona, foco central que discute como implementar um bom código que evite a criação do famoso anti-patter callback-hell do JavaScript.

Tudo na web se trata de consumismo e produção de conteúdo. Ler ou escrever blogs, assistir ou enviar vídeos, ver ou publicar fotos, ouvir músicas e assim por diante.

Isso fazemos naturalmente todos os dias na internet. E cada vez mais aumenta a necessidade dessa interação entre os usuários com os diversos serviços da web.

De fato, o mundo inteiro quer interagir mais e mais na internet, seja através de conversas com amigos em chats, jogando games online, atualizando constantemente suas redes sociais ou participando de sistemas colaborativos.

Esses tipos de aplicações requerem um poder de processamento extremamente veloz para que seja eficaz a interação em tempo real entre cliente e servidor.

E mais, isto precisa acontecer em uma escala massiva, suportando de centenas a milhões de usuários.

Então o que nós, desenvolvedores, precisamos fazer? Precisamos criar uma comunicação em tempo real entre cliente e servidor — que seja rápida, atenda muitos usuários ao mesmo tempo e utilize recursos de I/O (dispositivos de entrada e saída) de forma eficiente. Qualquer pessoa com experiência em desenvolvimento web sabe que a versão atual do HTTP 1.1 não foi projetada para suportar tais requisitos.

E pior, infelizmente existem aplicações que adotam de forma incorreta o uso deste protocolo, implementando soluções workaround ("Gambiarras") que requisitam constantemente o servidor de forma assíncrona, geralmente aplicando a técnica de long-polling.

Para sistemas trabalharem em tempo real, servidores precisam enviar e receber dados utilizando comunicação bidirecional, ao invés de utilizar intensamente request/response do HTTP aplicando Ajax. E também temos que manter esse tipo comunicação de forma leve e rápida para permitir escalabilidade em uma aplicação.

O problema das arquiteturas bloqueantes

Os sistemas para web desenvolvidos sobre plataformas como .NET, Java, PHP, Ruby ou Python possuem uma característica em comum: eles paralisam um processamento enquanto utilizam um I/O no servidor. Essa paralisação é conhecida como modelo blocking-thread.

Para entender melhor esse conceito, vamos a um exemplo: temos uma aplicação web e nela cada processo é uma requisição feita pelo usuário.

Com o decorrer da aplicação, novos usuários irão acessá-la, gerando múltiplos processos no servidor. Um sistema de arquitetura bloqueante vai enfileirar cada requisição que são realizadas ao mesmo tempo e depois ele vai processando, uma a uma.

Este modelo não permite múltiplos processamentos ao mesmo tempo. Enquanto uma requisição é processada, as demais ficam em espera, ou seja, a aplicação bloqueia os demais processos de fazer I/O no servidor, mantendo-os em um pequeno período de tempo numa fila de requisições ociosas.

Esta é uma arquitetura clássica, existente em diversos sistemas web e que possui um design ineficiente. É gasta grande parte do tempo mantendo requisições em uma fila ociosa enquanto é executado I/O para apenas uma requisição. Para exemplificar melhor, tarefas de I/O são tarefas de enviar e-mail, consultar o banco de dados, leitura de arquivos em disco.

E essas tarefas bloqueiam o sistema inteiro enquanto não são finalizadas. Com o aumento de usuários acessando o sistema, a frequência de gargalos será maior, surgindo a necessidade de se fazer uma escalabilidade vertical (upgrade dos servidores) ou escalabilidade horizontal (inclusão de novos servidores trabalhando para um load balancer). Ambos os tipos se tornam custosos, quando se fala em gastos com infraestrutura.

O ideal seria buscar novas tecnologias que façam bom uso dos servidores existentes, que permitam o uso intenso e máximo do processamento atual.

Foi baseado neste problema que, no final de 2009, Ryan Dahl, e mais 14 colaboradores, criaram o Node.js. Esta tecnologia possui um modelo inovador: sua arquitetura é totalmente non-blocking thread (não-bloqueante) que apresenta uma boa performance com consumo de memória e utiliza ao máximo e de forma eficiente o poder de processamento dos servidores, principalmente em sistemas que produzem uma alta carga de processamento.

Sistemas criados com Node.js estão livres de aguardarem por muito tempo o resultado de seus processos, e mais importante, não sofrem dead-locks, pelo simples fato de trabalharem em single-thread. Além dessas vantagens, desenvolver sistemas nessa plataforma é super simples e prático.

O Node.js é uma plataforma altamente escalável e de baixo nível, logo, você terá a possibilidade de programar diretamente com diversos protocolos de rede e internet ou utilizar bibliotecas que acessam recursos do sistema operacional. Para programar em Node.js basta dominar a linguagem JavaScript. Ele utiliza a engine Javascript V8, a mesma utilizada no navegador Google Chrome.

Características do Node.js

Single-thread

Suas aplicações serão single-thread, ou seja, cada aplicação terá instância de uma única thread por processo iniciado. Se você está acostumado a trabalhar com programação multithread, por exemplo, Java ou .NET, infelizmente não será possível com Node.js, mas saiba que existem outras maneiras de se criar um sistema que com processamento paralelo.

Por exemplo, você pode utilizar uma biblioteca nativa chamada de clusters, que é um módulo que permite implementar uma rede de processos de sua aplicação, você cria N processos de sua aplicação e uma delas se encarrega de balancear a carga, permitindo processamentos paralelos um único servidor. Outra maneira é adotar a programação assíncrona nas tarefas se seu servidor.

Esse será o assunto mais abordado durante o decorrer deste artigo, pelo qual explicaremos diversos cenários e exemplos práticos de como são executadas em paralelo, funções em assíncronas não-bloqueante.

Event-Loop

Node.js é orientado a eventos. Ele segue a mesma filosofia de orientação de eventos do JavaScript de browser; a única diferença são os eventos, ou seja, não existem eventos de click do mouse, keyup do teclado ou qualquer evento de componentes do HTM" [...]

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

Carregando
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Ajude-nos a evoluir: você gostou do post?  (14)  (0)
Confirmar voto
Compartilhe:
Ficou com alguma dúvida?