Introdução ao Node.js (Single-Thread, Event-Loop e mercado)

Este capítulo não tem por finalidade contar a história do Node.js, afinal de contas o site oficial e o guia de inicio rápido fazem isso muito bem. Serei prático e objetivo ao abordar somente os conceitos essenciais, logo indispensáveis a qualquer “desenvolvedor aventureiro”.

Livro

Este conteúdo representa um texto de amostra (primeira versão ainda em desenvolvimento) do Livro Node.js para iniciantes. Para acompanhar o desenvolvimento, acesse: https://github.com/fabiojaniolima/livros#livros

O que é Node.js

No guia oficial de começo rápido (Quick Start), temos basicamente a seguinte introdução:

O Node.js é um ambiente de tempo de execução JavaScript de código aberto e multiplataforma. É uma ferramenta popular para quase qualquer tipo de projeto!

O Node.js executa o motor JavaScript V8, o núcleo do Google Chrome, fora do navegador. Isso permite que o Node.js seja muito eficiente.

Para maiores detalhes a respeito, bem como para conhecer a história da plataforma, acesse: https://nodejs.dev/introduction-to-nodejs

Em outras palavras, o Node.js é um runtime JavaScript server-side, ou seja, uma solução que possibilita ao desenvolvedor executar aplicações escritas em JavaScript do lado do servidor, de forma simples, rápida e performática. Isso é possível basicamente graças ao motor V8 e a biblioteca libuv, solução open-source para a qual dedicaremos mais algumas linhas logo adiante.

Antes de continuar

Antes de podermos continuar, é muito importante que você tenha conhecimento e gaste ao menos alguns minutos explorando os links abaixo:

Funcionamento básico

Vejo iniciantes quebrando a cabeça, torrando até o ultimo neurônio para entender o ciclo de vida dos eventos dentro da plataforma Node.js, falando assim até parece ser algo complexo, não é mesmo? Calma, eu falei que parece, mas como todos sabem as aparências enganam. 😉

Não será necessário mais do que dois tópicos (Single-Thread e Event-Loop) para explicar o comportamento, a forma como essa plataforma manipula os eventos a serem processados.

Single-Thread

O Node.js é uma plataforma orientada a eventos que utiliza o conceito de thread única para gerenciar a pilha de eventos ou pilha de chamada (Call Stack), que por sinal adota o comportamento do tipo LIFO (última entrada, primeira saída). As operações de background no Node são gerenciadas por works que rodam em segundo plano, estes sim podem conter operações multi-thread.

E estes tais works, afinal de contas o que são? Os works são processos em background de I/O assíncrono não bloqueastes gerenciados pela libuv, uma biblioteca open source multiplataforma escrita em linguagem C, a qual utiliza um thread-pool para gerenciar operações paralelas.

Este comportamento de thread única para manipulação da Call Stack é o que garante tanta performance a essa plataforma conforme veremos mais adiante.

Não se preocupe, estudaremos este comportamento na prática ao longo desta obra, porém, caso neste momento queira aprofundar-se um pouco mais no conceito, acesse: https://nodejs.dev/the-nodejs-event-loop

Event-Loop

Tentarei abordar o Event-Loop da forma mais simples e objetiva possível, deixando de lado conceitos que para nossa realidade, ainda mais neste momento, não iriam agregar valor algum, podendo ainda tornar este tópico desnecessariamente complexo, tais como Micro Task Queue, Next Tick Queue, Timers Queue, Immediates Queue e outros.

Veja abaixo uma representação abstrata do Event-Loop, bem como seu funcionamento:

Representação simples e abstrata do Event-Loop.

Os eventos entrantes são empilhado na Stack, o Event-Loop fica responsável por monitorar a Stack em busca de eventos a serem processados, quando um evento é encontrado e este não representa uma “operação longa” o mesmo é imediatamente executado e o Event-Loop liberado para prosseguir com a execução do próximo evento da Stack.

Se tivermos uma “operação longa”, como por exemplo ler um arquivo em disco, realizar comunicação a nível de rede e assim por diante, o Event-Loop irá despachar essa operação juntamente com seu callback (chamada de retorno) para o Background Thread, ou seja, neste momento a libuv ganhará a responsabilidade de gerenciar essa execução em uma thread separada do Event-Loop, liberando o mesmo para prosseguir com a execução dos eventos ainda presentes na Stack. Quando essa tarefa que está rodando em uma thread separada for concluída, a sua função de callback será adicionado a Task Queue, que por sua vez aguardará o Event-Loop terminar sua tarefa (lembra, ele é Single-Thread, executa uma coisa por vez) para entrar na Stack e ter sua instrução executada.

Veja este exemplo:

Representação simples e abstrata do Event-Loop e seu funcionamento.

Neste exemplo temos dois eventos na Stack, quem será processado primeiro? O fs.readFile(), lembre-se, a Stack é do tipo LIFO (última entrada, primeira saída). Como fs.readFile() representa uma operação em disco, ou seja, uma operação lenta/longa ou bloqueante, essa é delegada para a libuv operar em background, quando essa tarefa for concluída seu callback será adicionado a Task Queue que por sua vez aguardará para entrar na Stack e ter sua instrução processada. Quando isso irá acontecer? Quando a Stack estiver vazia, ai sim o callback será movido da Task Queue para a Stack e então processado pelo Event-Loop.

Caso tenha interesse em aprofundar no assunto, acesse: https://dev.to/khaosdoctor/node-js-por-baixo-dos-panos-3-um-mergulho-no-event-loop-38l9 e https://imasters.com.br/front-end/node-js-o-que-e-esse-event-loop-afinal

Vantagens da plataforma

  • Gerenciador de pacotes nativo: o NPM (Node Package Manager) é o gerenciador de pacotes/dependências padrão do Node.js, ou seja, instalou o Node você já tem tudo necessário para iniciar a brincadeira (desenvolvimento);
  • JavaScript como linguagem de programação: antes do Node.js a linguagem JavaScript era utilizada para validar dados em formulários web, adicionar uma animação/efeito aqui e ali. Com a chegada do Node a coisa ganhou novos horizontes e a comunidade explodiu; Ainda dentro deste tópico é valido citar o fato de podermos utilizar JavaScript no front-end e no back-end, bem como para desenvolvimento mobile e desktop;
  • Comunidade ativa: a comunidade Node.js e JavaScript são uma só, afinal de contas essa plataforma também é largamente utilizada para automatizar tarefas inerentes ao desenvolvimento front-end, tais como automação das tarefas de mimificação de arquivo, empacotamento, validação, testes e assim por diante;
  • Leve/performático: o comportamento apresentado no tópico sobre Event-Loop garante uma performance incrível ao Node.js, principalmente em termos de consumo de RAM e CPU. Como cada nova requisição ao servidor será empilhada na Stack e gerenciada por um processo único, nosso servidor não precisa gastar recurso extra para abrir um novo processo para cada usuário;
  • Non-Blocking I/O: conforme já foi dito o Node.js não bloqueia seu fluxo para processar tarefas bloqueastes (longa, pesadas e/ou custosas), ou seja, tarefas que envolvem I/O assíncrono — lembre-se do que vimos sobre libuv.

Quem está utilizando?

Essa tecnologia é uma das queridinhas do mundo moderno, utilizada por indivíduos, empresas e grandes corporações ao redor do mundo. Veja alguns dos nomes que estão utilizando essa tecnologia:

  • Netflix
  • Trello
  • Paypal
  • LinkedIn
  • Walmart
  • Uber
  • Medium
  • Groupon
  • Ebay
  • NASA

E a lista vai longe… Títulos de peso em! O negócio parece ser bom mesmo!

Vale a pena investir em JavaScript?

As soluções construidas sobre a plataforma Node.js são concebidas basicamente em linguagem JavaScript (ou TypeScript, que no fim das contas será transpirada para JavaScript). Então a pergunta que não quer calar é: vale a pena investir na linguagem JavaScript? Isso é o que iremos descobrir nos parágrafos seguintes.

O Stack Overflow, uma das comunidades mais famosas do mundo, especialmente admirada pelos desenvolvedores, publica anualmente uma pesquisa bem detalhada referente as tecnologias, linguagens e tendências ligadas a este mundo cibernético. De 2014 até o ano de 2019 (último relatório publicado até o momento) a linguagem JavaScript tem ocupado a primeira posição no ranking da querida dos desenvolvedores, em 2013 ficou em segundo lugar, perdendo somente para a linguagem SQL.

Em 2019:

Relatório 2018. Fonte: https://insights.stackoverflow.com/survey/2019

Em 2018:

Relatório 2018. Fonte: https://insights.stackoverflow.com/survey/2018

Em 2017:

Relatório 2017. Fonte: https://insights.stackoverflow.com/survey/2017

Acesse todos os relatórios em: https://insights.stackoverflow.com/survey

Estes dados corroboram para a máxima de que existe demanda de mercado para estes profissionais, afinal de contas se a procura por tal conhecimento está tão alta por um período tão longo de tempo, logo significa que este mesmo conhecimento está sendo requerido em algum lugar. E digo mais, isso significa que essa tecnologia está evoluindo a ponto de deixar todo mundo feliz!

Vai JavaScript, ao infinito e além! 🚀🚀 🚀

Palestrante, analista de sistemas e webmaster. Apaixonado pelo universo da tecnologia e um profundo admirador da filosofia do software livre.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store