SlideShare uma empresa Scribd logo
Funcionamento interno
do Node.js
Kirmayr Tomaz
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
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
SUMÁRIO
• Node Interno
○ Conceitos base
○ Estrutura do Node.js
○ Libuv
○ V8
•TurboFan
•Ignition
○ APIs
Node.js
Node.js Terminologia
● Single Thread
● Paralelismo e concorrência
● Síncrono e assíncrono
● I/O não bloqueante
● Orientada a Eventos
Estrutura do Node.js
Dependências Internas
● Libuv
● V8
● C-iris
● Crypto
● HTTP-parse
● Zlib
● OpenSSL
Ferramentas
● npm
● gyp
● gtest
V8 Libuv zlib
HTTP-
parse
OpenSSLC-ares
Node.js Binding Addons
Application/Module(JS)
V8 Libuv zlib
HTTP-
parse
OpenSSLC-ares
Node.js Binding Addons - N-API
Application/Module(JS)
Libuv
Libuv
Uma biblioteca open-source multiplataforma com
foco em I/O assincrono, desenvolvida
inicialmente para o Node.js
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
Event Loop?
Como Funciona o
Callstack
● Sequência de chamadas de função que foram
executadas pela linguagem - LIFO (Last-in First Out)
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’)
CallStack
console
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’)
CallStack
IsNumber
IsType
CallStack
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’) console
CallStack
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’) console
Task Queue
● Background Thread (Pull Thread)
● Task Queue - Local onde os callbacks ficam
aguardando serem chamados
● Event Loop
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
console
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout 1
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
IsNumber
IsType
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
console
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout2
setTimeout2
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout2
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’)
console
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout2
setTimeout1 setTimeout2
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
setTimeout1
CallStack Background
Thread
Task Queue
Event Loop
setTimeout2
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
setTimeout2
Task Queue
● Macro Task - São processadas pelo Event Loop
● Micro Task - são programadas para executar após a
execução principal do código
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
console
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
setTimeout
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
Promise
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise then Promise then
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
console
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise then
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
Promise then
Promise then
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise then
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
Promise then
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
setTimeout
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
setTimeout
Não Bloqueie o
Event Loop
ATT> NODE.js
V8
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.
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
Design Elements
ATT> NODE.js
V8 - Classes Ocultas
● Uma das formas para minimizar esse problema é
utilizando as classes ocultas
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
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
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”;
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
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
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
Quanto mais previsíveis
são os objetos menos
classes ocultas serão
criadas Daniel Clifford
Manager and Tech Lead V8 Team,
Google Chrome
V8 - Dynamic Machine Code Generation
● Compilador Completo
○ Inline Cache
● Compilador Otimizado
V8 - Dynamic Code Generation
http://v8-io12.appspot.com/#68
Pipeline V8
Pipeline de compilação (2010)
Full-
Codegen
Código Não
Otimizado
Crankshaft
Código
otimizado
Parser AST
JavaScript
OtimizaçãoBaseline
Referência: TurboFan: A new code generation architecture for V8
V8 - Turbofan
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
Full-
Codegen
Código Não
otimizado
Crankshaft
Código
otimizado
TurboFan
Parser AST
JavaScript
OtimizaçãoBaseline
Referência: TurboFan: A new code generation architecture for V8
Pipeline de compilação (2014)
V8 - Ignition
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
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
Ignition
Bytecode
Código
otimizado
TurboFan
Parser AST
JavaScript
OtimizaçãoInterpretador
Referência: TurboFan: A new code generation architecture for V8
Pipeline de compilação (2017)
API’s Nodejs
MUITO
O que fazer quando a aplicação necessita de
processamento ou
bloqueia o Event Loop ?
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
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
Não bloqueie o event
loop, crie um Child
Process
V8
MÚLTIPLOS NÚCLEOS
Possuo um processador
porém o node.js utiliza apenas uma
única Thread
● 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
Funcionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticas
Conclusão
Funcionamento interno do node.js e boas práticas
Obrigado xD
Referências
Estrutura interna Node.js
- https://nodejs.org/en/docs/meta/topics/dependencies/
Libuv
- http://docs.libuv.org/en/v1.x/design.html
Event Loop
- http://latentflip.com/loupe/
- https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/
- https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/
- https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
- http://walde.co/2016/11/27/node-js-o-que-e-esse-event-loop-afinal/
- https://www.youtube.com/watch?v=8aGhZQkoFbQ
- https://www.youtube.com/watch?v=va8-xdxTywU
Referências
V8
- https://www.html5rocks.com/en/tutorials/speed/v8/
- http://developers.scup.com/otimizando-seu-javascript-no-v8-node-js/
- https://github.com/v8/v8/wiki/Design%20Elements
- https://www.youtube.com/watch?v=UJPdhx5zTaw
- Turbofan - https://www.youtube.com/watch?v=M1FBosB5tjM
Child Process
- https://nodejs.org/api/child_process.html
Cluster
- https://nodejs.org/api/cluster.html
- http://rowanmanning.com/posts/node-cluster-and-express/
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

Mais conteúdo relacionado

PDF
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas
 
PDF
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Rodrigo Branas
 
PDF
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas
 
PDF
Workshop de desenvolvimento para blockchain Ethereum
OriginalMy.com
 
PDF
Webinar: Porque o RTOS não faz o que eu quero?
Embarcados
 
PDF
Kernel com requisitos temporais
Rodrigo Almeida
 
PDF
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
PPTX
Node.js para desenvolvedores .NET
MVP Microsoft
 
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Rodrigo Branas
 
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas
 
Workshop de desenvolvimento para blockchain Ethereum
OriginalMy.com
 
Webinar: Porque o RTOS não faz o que eu quero?
Embarcados
 
Kernel com requisitos temporais
Rodrigo Almeida
 
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
Node.js para desenvolvedores .NET
MVP Microsoft
 

Mais procurados (7)

PDF
Ferramentas para desenvolvimento no blockchain Ethereum
OriginalMy.com
 
PDF
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
Cezinha Anjos
 
PDF
Rtai Apresentacao
Líus Fontenelle Carneiro
 
ODP
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
Eloi Júnior
 
PDF
Jsummit 2014
Otávio Santana
 
PPTX
Tutorial JavaFX simples
Clodoaldo Brasilino
 
PPTX
Depuração de software
Leonardo Soares
 
Ferramentas para desenvolvimento no blockchain Ethereum
OriginalMy.com
 
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
Cezinha Anjos
 
Rtai Apresentacao
Líus Fontenelle Carneiro
 
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
Eloi Júnior
 
Jsummit 2014
Otávio Santana
 
Tutorial JavaFX simples
Clodoaldo Brasilino
 
Depuração de software
Leonardo Soares
 
Anúncio

Semelhante a Funcionamento interno do node.js e boas práticas (20)

PDF
Node.js no Pagar.me
Pedro Franceschi
 
PPTX
Javascript para CSharpers 2 - Functions
Wesley Lemos
 
PPTX
Trabalhando de Forma Assíncrona com JavaScript
Lucas Anderson
 
PPTX
Introdução ao Node.js - FATEC SP
Arthur Fücher
 
PDF
IBM - Curso Node + Angular - Aula 01
Claudiney Junior
 
PPTX
NodeJS Under the Hood - Concurrency and Multithreading
Rhuan Karlus Silva
 
PPTX
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
Jackson F. de A. Mafra
 
PPTX
Node.js
luizhse
 
ODP
Conhecendo o Nodejs
Caio Cutrim
 
PDF
Node.js, Uma breve introdução
Pablo Feijó
 
PDF
Node js - Javascript Server Side
Gustavo Corrêa Alves
 
PDF
Node.JS - Workshop do básico ao avançado
Eduardo Bohrer
 
PPTX
Introdução ao Nodejs
Márcio Silvestroni
 
PPTX
Node.js - Devo adotar na minha empresa?
Pablo Souza
 
PDF
Node.js e Express
Dan Vitoriano
 
PDF
Realtime com node.js e socket.io
Caio Ribeiro Pereira
 
PPT
Nodejs justdigital
Just Digital
 
PDF
Node.js - #1 - Introdução - Rodrigo Branas
Rodrigo Branas
 
PPTX
APRESENTAÇÃO ISAQUE E RAQUEL QUARTA- VICTOR.pptx
jorelzin0606
 
PPTX
NodeJS - Tutorial de forma simples e pratica.
Filipe Morelli
 
Node.js no Pagar.me
Pedro Franceschi
 
Javascript para CSharpers 2 - Functions
Wesley Lemos
 
Trabalhando de Forma Assíncrona com JavaScript
Lucas Anderson
 
Introdução ao Node.js - FATEC SP
Arthur Fücher
 
IBM - Curso Node + Angular - Aula 01
Claudiney Junior
 
NodeJS Under the Hood - Concurrency and Multithreading
Rhuan Karlus Silva
 
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
Jackson F. de A. Mafra
 
Node.js
luizhse
 
Conhecendo o Nodejs
Caio Cutrim
 
Node.js, Uma breve introdução
Pablo Feijó
 
Node js - Javascript Server Side
Gustavo Corrêa Alves
 
Node.JS - Workshop do básico ao avançado
Eduardo Bohrer
 
Introdução ao Nodejs
Márcio Silvestroni
 
Node.js - Devo adotar na minha empresa?
Pablo Souza
 
Node.js e Express
Dan Vitoriano
 
Realtime com node.js e socket.io
Caio Ribeiro Pereira
 
Nodejs justdigital
Just Digital
 
Node.js - #1 - Introdução - Rodrigo Branas
Rodrigo Branas
 
APRESENTAÇÃO ISAQUE E RAQUEL QUARTA- VICTOR.pptx
jorelzin0606
 
NodeJS - Tutorial de forma simples e pratica.
Filipe Morelli
 
Anúncio

Último (20)

PPTX
Saude_mental_no_trabalho_psicologia organizacional
mbjustus
 
PPTX
Slides Lição 5, CPAD, Uma Igreja Cheia de Amor, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
PDF
Mat - Seguindo as setas adição subtração multplicação e divisão.
Mary Alvarenga
 
PDF
A casa1.pdf com todas as divisões e objetos
biblioteca123
 
PDF
Inteligência Artificial Generativa - CMMG.pdf
Ana Paula Coelho Barbosa
 
PDF
DiálogoRedes sociais.pdfinstagram, tik tok
biblioteca123
 
PDF
OUTONO EM VERSOS - Poesias, Poetrix e Acróstico
elvandroburity
 
DOCX
Mapa das Ilhas Salomão - Mapa dos Países do Mundo
Doug Caesar
 
DOCX
LP - 5º ANO - 2º BIMESTRE - PLANEJAMENTO BIMESTRAL 2025.docx
VivianeAlmeida284960
 
PPTX
DERIVA URBANA EM FEIRA DE SANTANA BAHIA.pptx
JanmileSilva1
 
PDF
O sonho do campo.pdf, com animais e pessoas
biblioteca123
 
PDF
🩺 Ser Enfermeiro.pdfou médico ou outra coisa
biblioteca123
 
PDF
🧑Entrevista de trabalho.pdf para um lugar
biblioteca123
 
PPTX
Slides Lição 4, CG, Pedro, A Epístola Da Esperança, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
PDF
Casa2.pdf, apartamento, vivenda, moradia.moadia
biblioteca123
 
PDF
FICHA FINANÇAS: como controlar meu dinheiro
Professor Belinaso
 
PPTX
slide de historia sobre o descobrimento do brasil
speedgames391
 
PDF
Matéria e Ambiente - BIOLOGIA - Terceiro Ano do Ens. Médio
islaineeli
 
DOCX
Mapa da Austrália - Mapa dos Países do Mundo.docx
Doug Caesar
 
PDF
A Geografia de Portugal.pdfRegiões e relevo.
biblioteca123
 
Saude_mental_no_trabalho_psicologia organizacional
mbjustus
 
Slides Lição 5, CPAD, Uma Igreja Cheia de Amor, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
Mat - Seguindo as setas adição subtração multplicação e divisão.
Mary Alvarenga
 
A casa1.pdf com todas as divisões e objetos
biblioteca123
 
Inteligência Artificial Generativa - CMMG.pdf
Ana Paula Coelho Barbosa
 
DiálogoRedes sociais.pdfinstagram, tik tok
biblioteca123
 
OUTONO EM VERSOS - Poesias, Poetrix e Acróstico
elvandroburity
 
Mapa das Ilhas Salomão - Mapa dos Países do Mundo
Doug Caesar
 
LP - 5º ANO - 2º BIMESTRE - PLANEJAMENTO BIMESTRAL 2025.docx
VivianeAlmeida284960
 
DERIVA URBANA EM FEIRA DE SANTANA BAHIA.pptx
JanmileSilva1
 
O sonho do campo.pdf, com animais e pessoas
biblioteca123
 
🩺 Ser Enfermeiro.pdfou médico ou outra coisa
biblioteca123
 
🧑Entrevista de trabalho.pdf para um lugar
biblioteca123
 
Slides Lição 4, CG, Pedro, A Epístola Da Esperança, 3Tr25.pptx
LuizHenriquedeAlmeid6
 
Casa2.pdf, apartamento, vivenda, moradia.moadia
biblioteca123
 
FICHA FINANÇAS: como controlar meu dinheiro
Professor Belinaso
 
slide de historia sobre o descobrimento do brasil
speedgames391
 
Matéria e Ambiente - BIOLOGIA - Terceiro Ano do Ens. Médio
islaineeli
 
Mapa da Austrália - Mapa dos Países do Mundo.docx
Doug Caesar
 
A Geografia de Portugal.pdfRegiões e relevo.
biblioteca123
 

Funcionamento interno do node.js e boas práticas

  • 2. Sobre mim Kirmayr Tomaz ● De Manaus/AM ● Bacharel em Sistemas de Informação - UFAM ● Organizador do Femug-AM ● Mentor no Traning Center @kirmayrtomaz [email protected]
  • 3. Sobre mim Kirmayr Tomaz ● De Manaus/AM ● Bacharel em Sistemas de Informação - UFAM ● Organizador do Femug-AM ● Mentor no Traning Center @kirmayrtomaz [email protected]
  • 4. SUMÁRIO • Node Interno ○ Conceitos base ○ Estrutura do Node.js ○ Libuv ○ V8 •TurboFan •Ignition ○ APIs
  • 6. Node.js Terminologia ● Single Thread ● Paralelismo e concorrência ● Síncrono e assíncrono ● I/O não bloqueante ● Orientada a Eventos
  • 7. Estrutura do Node.js Dependências Internas ● Libuv ● V8 ● C-iris ● Crypto ● HTTP-parse ● Zlib ● OpenSSL Ferramentas ● npm ● gyp ● gtest
  • 8. V8 Libuv zlib HTTP- parse OpenSSLC-ares Node.js Binding Addons Application/Module(JS)
  • 9. V8 Libuv zlib HTTP- parse OpenSSLC-ares Node.js Binding Addons - N-API Application/Module(JS)
  • 10. Libuv
  • 11. Libuv Uma biblioteca open-source multiplataforma com foco em I/O assincrono, desenvolvida inicialmente para o Node.js
  • 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
  • 14. Callstack ● Sequência de chamadas de função que foram executadas pela linguagem - LIFO (Last-in First Out)
  • 15. console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) CallStack console
  • 16. console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) CallStack IsNumber IsType
  • 17. CallStack console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) console
  • 18. CallStack console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) console
  • 19. Task Queue ● Background Thread (Pull Thread) ● Task Queue - Local onde os callbacks ficam aguardando serem chamados ● Event Loop
  • 20. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop console
  • 21. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout 1
  • 22. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 IsNumber IsType
  • 23. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 console
  • 24. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout2 setTimeout2
  • 25. CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout2 console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’) console
  • 26. CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout2 setTimeout1 setTimeout2 console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); setTimeout1
  • 27. CallStack Background Thread Task Queue Event Loop setTimeout2 console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); setTimeout2
  • 28. Task Queue ● Macro Task - São processadas pelo Event Loop ● Micro Task - são programadas para executar após a execução principal do código
  • 29. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); console
  • 30. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); setTimeout
  • 31. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); Promise
  • 32. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise then Promise then console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); console
  • 33. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise then console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); Promise then Promise then
  • 34. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise then console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); Promise then
  • 35. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout setTimeout console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); setTimeout
  • 36. Não Bloqueie o Event Loop ATT> NODE.js
  • 37. V8
  • 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
  • 49. V8 - Dynamic Machine Code Generation ● Compilador Completo ○ Inline Cache ● Compilador Otimizado
  • 50. V8 - Dynamic Code Generation http://v8-io12.appspot.com/#68
  • 52. Pipeline de compilação (2010) Full- Codegen Código Não Otimizado Crankshaft Código otimizado Parser AST JavaScript OtimizaçãoBaseline Referência: TurboFan: A new code generation architecture for V8
  • 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
  • 55. Full- Codegen Código Não otimizado Crankshaft Código otimizado TurboFan Parser AST JavaScript OtimizaçãoBaseline Referência: TurboFan: A new code generation architecture for V8 Pipeline de compilação (2014)
  • 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
  • 59. Ignition Bytecode Código otimizado TurboFan Parser AST JavaScript OtimizaçãoInterpretador Referência: TurboFan: A new code generation architecture for V8 Pipeline de compilação (2017)
  • 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
  • 64. Não bloqueie o event loop, crie um Child Process V8
  • 65. MÚLTIPLOS NÚCLEOS Possuo um processador porém o node.js utiliza apenas uma única Thread
  • 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
  • 72. Referências Estrutura interna Node.js - https://nodejs.org/en/docs/meta/topics/dependencies/ Libuv - http://docs.libuv.org/en/v1.x/design.html Event Loop - http://latentflip.com/loupe/ - https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ - https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/ - https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ - http://walde.co/2016/11/27/node-js-o-que-e-esse-event-loop-afinal/ - https://www.youtube.com/watch?v=8aGhZQkoFbQ - https://www.youtube.com/watch?v=va8-xdxTywU
  • 73. Referências V8 - https://www.html5rocks.com/en/tutorials/speed/v8/ - http://developers.scup.com/otimizando-seu-javascript-no-v8-node-js/ - https://github.com/v8/v8/wiki/Design%20Elements - https://www.youtube.com/watch?v=UJPdhx5zTaw - Turbofan - https://www.youtube.com/watch?v=M1FBosB5tjM Child Process - https://nodejs.org/api/child_process.html Cluster - https://nodejs.org/api/cluster.html - http://rowanmanning.com/posts/node-cluster-and-express/
  • 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