- O documento apresenta os principais conceitos do funcionamento interno do Node.js, incluindo a estrutura, dependências e ferramentas.
- As partes fundamentais são o V8 para interpretar JavaScript e o Libuv para I/O assíncrono.
- O event loop é responsável por manter o código assíncrono executando de forma não bloqueante através da fila de tarefas e microtarefas.
2. Sobre mim
Kirmayr Tomaz
● De Manaus/AM
● Bacharel em Sistemas de Informação
- UFAM
● Organizador do Femug-AM
● Mentor no Traning Center
@kirmayrtomaz
tomaz.kirmayr@gmail.com
3. Sobre mim
Kirmayr Tomaz
● De Manaus/AM
● Bacharel em Sistemas de Informação
- UFAM
● Organizador do Femug-AM
● Mentor no Traning Center
@kirmayrtomaz
tomaz.kirmayr@gmail.com
4. SUMÁRIO
• Node Interno
○ Conceitos base
○ Estrutura do Node.js
○ Libuv
○ V8
•TurboFan
•Ignition
○ APIs
12. Libuv
● Event loop
● TCP e UDP socket assíncrono
● DNS assíncrono
● Operações assíncronas com arquivos
● Eventos de arquivos
● Thread pool
● Internal Process Communication (IPC) compartilhado entre os
sockets
● Child processes
38. V8
● Projeto Open-source desenvolvida pela Google, para
interpretar código javascript super performático, escrito
em C++ utilizado pelo google Chrome, Node.js e afins.
39. V8
● O javascript possui pouca informação sobre quais são
os tipos dos valores na sua aplicação, sendo que eles
podem mudar em tempo de execução
● Tipagem dinâmica pode ser um dos principais recursos
da linguagem, mas também é um dos principais motivos
pelos quais muitas vezes executa mais lento que
linguagens estaticamente tipadas
41. V8 - Classes Ocultas
● Uma das formas para minimizar esse problema é
utilizando as classes ocultas
42. function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class P0
43. function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class P0
Initial
Hidden
Class PA
44. Person
Object
Initial
Hidden
Class PA
Initial
Hidden
Class PB
Initial
Hidden
Class P0
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
45. function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class PA
Initial
Hidden
Class PB
Initial
Hidden
Class P0
46. function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class PA
Initial
Hidden
Class PB
Initial
Hidden
Class P0
47. function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class PB
Initial
Hidden
Class PC
Initial
Hidden
Class PA
Initial
Hidden
Class P0
48. Quanto mais previsíveis
são os objetos menos
classes ocultas serão
criadas Daniel Clifford
Manager and Tech Lead V8 Team,
Google Chrome
54. TurboFan
● Iniciado em 2013
● Feito para otimizar as novas features do ES6
● Otimização mais sustentável e extensível para todas as
arquiteturas
● O Turbofan adicionou uma fase explícita de compilação de
seleção de instruções que permite escrever muito menos
codigo específico para cada arquitetura
57. V8 - Ignition
● Redução do consumo de memória dos
dispositivos móveis com 512mb-1g ram
● Redução de memória
● Redução do overhead do parse
● Código 8x menor que o do Full-Codegen
● Utiliza o Back-end do Turbofan
58. Junção do Ignition + Turbofan
● TurboFan e Ignition são utilizados na versão 5.9 do V8
● Menor consumo de memória
● Preocupação em otimizar códigos (BlueBird, Babel e etc)
● 20-35% mais rápido pelo Speedometer
● No Node.js 10%+ performance
61. MUITO
O que fazer quando a aplicação necessita de
processamento ou
bloqueia o Event Loop ?
62. Child Process
● Node foi desenvolvimento para processos que
necessitam de muito I/O
● Pode ajudar a externalizar o uso intensivo de CPU da
sua single Thread do Node.js
63. Child Process
● Deixa o event Loop do processo pai mais limpo
● Cria um processo filho, ouve e controla
● Exec() e Spawn()
○ Exec executa em buffer
○ Spawn cria um novo processo e retorna uma
interface de stream pelo I/O
66. ● Uma única instância do node é executada numa single
Thread
● Uma das vantagens de ter um processador de
múltiplos núcleos é que às vezes ele pode ser
executado em clusters
● O Node.js se encarrega de executar e balancear a
carga para cada processo
Cluster
74. Centro
Av. Presidente Wilson,
231 - 29º andar
(21) 2240-2030
Cidade Monções
Av. Nações Unidas,
11.541 - 3º andar
(11) 4119-0449
Savassi
Av. Getúlio Vargas, 671
Sala 800 - 8º andar
(31) 3360-8900
www.concrete.com.br
Centro
Av. Presidente Wilson,
231 - 29º andar
(21) 2240-2030
Cidade Monções
Av. Nações Unidas,
11.541 - 3º andar
(11) 4119-0449
Savassi
Av. Getúlio Vargas, 671
Sala 800 - 8º andar
(31) 3360-8900
www.concrete.com.br