Ola pessoal, tudo bem?

Estou estudando um pouco sobre a arquitetura do NodeJS, e gostaria de compartilhar o que descobri até agora com vocês.

Arquitetura

O NodeJS oferece a possibilidade de utilizar javascript do lado do servidor, e é muito conhecido pelo seu design, onde o I/O é orientado a eventos e não é bloqueante.

Os componentes principais:

  • A biblioteca Libuv que, em resumo, possibilita o modelo de IO assíncrono (Network e File System);
  • E o interpretador de Javascript V8 da Google.

nodejs-architecture

 

A integração entre o V8, escrito em C++, e a Libuv, escrita em C, é feita por uma camada de bindings escrita em C++. E acima dela, estão as bibliotecas do NodeJS (em Javascript), que fornecem as apis para o desenvolvimento das aplicações (http, https, fs, etc).

Quando falamos que o NodeJS é “single threaded”, a afirmação é parcialmente verdadeira.  O código escrito em Javascript não pode usufruir de múltiplas threads, contudo internamente a Libuv gerencia todo o IO assíncrono executando as operações em worker threads.

Event Loop

O modelo de execução do NodeJS é baseado em um Event Loop (Loop de eventos),que é o coração do NodeJS e é executado na thread principal. Logo que a aplicação é iniciada o NodeJS inicia o loop de eventos, e o mantém até não existirem mais callbacks a serem executados, finalizando assim a aplicação.

nodejs-architecture2

 

Então,  quando o código abaixo é executado

o que está ocorrendo é:

  • O código javascript é compilado pelo V8 para código nativo;
  • Em seguida, a operação assíncrona  readFile com o callback function (err, data){}  associado é enviada ao loop de eventos;
  • A operação assíncrona readFile é então executada em uma worker thread pela Libuv (enquanto isso o loop processa outros eventos);
  • Quando finalizada a operação readFile, o callback associado é adicionado a fila de eventos (Event Queue – FIFO)  com o conteúdo do arquivo em um buffer;
  • A fila de eventos então é consumida pelo loop de eventos que executa o callback (em Javascript) com o console.log(data); ;
  • A aplicação é finalizada.

Conclusão

Em um cenário onde o Node é utilizado como um servidor, este modelo possibilita que milhares de conexões sejam executadas concorrentemente. Em contrapartida, não é recomendado executar operações onerosas que bloqueiem o Loop de Eventos, pois os eventos na fila de eventos sofreriam as consequências sobre a performance, visto que a execução é sequencial e os mesmos estarão aguardando a finalização da execução atual.

Era isso pessoal.

Como falei estou ainda aprendendo sobre a arquitetura do Node. Por este motivo se alguém quiser complementar, compartilhar ou discutir detalhes, será muito bem vindo!

Um grande abraço!