SlideShare uma empresa Scribd logo
SHARKTOWER
A I - D R I V E N P R O J E C T M A N A G E M E N T
NodeJS Under the Hood
Concorrência e Multithreading
Apresentação
Raphael Ferreira
Engenheiro de Software - Sharktower
Cursando Engenharia de Software - UFG
Rhuan Karlus
DevOps Lead Core Team - Sharktower
Cursando Engenharia de Computação - UFG
O que é NodeJS
Seu Código
V8
Core Modules
C++ Bindings
libuv
http-parser, c-ares,
OpenSSL, zlib
Sistema Operacional
V8 e libuv
● Tradutor / JS Engine (Just in Time Compiler)
● Garbage Collection
● Não é responsável por file system, http requests,
console, DOM
V8
● Event-driven Asynchronous i/o Model
● Network i/o, File i/o, DNS …
● Timers
● Thread Pool (4)
● Event Loop
libuv
V8 executa seu código dentro do event
loop em apenas uma thread
Event Loop
Timers
Pending
Callbacks
Poll for I/O
Check
Close callbacks
Incoming:
connections,
data, etc
resource: https://nodejs.org/uk/docs/guides/event-loop-timers-and-nexttick/
setTimeout
setInterval
I/O
Magic
setImmediate
close
events
resource: Bert Belder talk
https://www.youtube.com/watch?v=PNa9OMajw9w
index.js
process#exit
resource: Bert Belder talk
https://www.youtube.com/watch?v=PNa9OMajw9w
callback
nextTick
callback
Promise
Resolve
Timer Heap
Sistema Operacional
Thread Pool
index.js
process#exit
index.js
process#exit
net.Server.listen()
index.js
process#exit
index.js
process#exit
index.js
process#exit
refs--
Async
● Como criar código assíncronno (de
verdade) em NodeJS?
○ Addons
○ Workers
○ Quando utilizar Workers e quando
utilizar Addons
● Coding time
Async
● Como criar código assíncronno (de
verdade) em NodeJS?
○ Addons
○ Workers
○ Quando utilizar Workers e quando
utilizar Addons
● Coding time
Async
Você pode criar um Addon, que faz
uso do threadpool disponibilizado pela
LibUV, ou você pode criar um Worker
(node -v 10+) que faça seu processamento
em paralelo, enquanto o Event Loop
continua desbloqueado para tratar qualquer
requisição que o servidor receba.
Addons
● Como criar código assíncronno (de
verdade) em NodeJS?
○ Addons
○ Workers
○ Quando utilizar Workers e quando
utilizar Addons
● Coding time
Async
> https://nodejs.org/api/addons.html#addons_c_addons
Um Addon é um objeto
compartilhado dinamicamente linkado que
pode ser escrito em C ou C++. A função
require() pode carregar um Addon como
um módulo NodeJS qualquer.
Ok, mas como
criar um
Addon?
Ok, mas como
criar um
Addon?
1. Crie um arquivo escrito em C ou C++
2. Instale o módulo node-gyp globalmente
3. Crie o arquivo binding.gyp que mapeia o diretório de
addons e como eles devem ser importados.
4. No terminal: node-gyp configure build
5. Dentro de algum código JS: const addonModule =
require("<build-folder-path>/Release/<addon-name>");
6. addonModule.function(params)
Workers
● Como criar código assíncronno (de
verdade) em NodeJS?
○ Addons
○ Workers
○ Quando utilizar Workers e quando
utilizar Addons
● Coding time
Async
https://nodejs.org/api/worker_threads.html#worker_threa
ds_worker_threads
Um Worker é uma thread que executa
código JS em paralelo. O módulo worker_threads foi
lançado na versão 10 com estabilidade experimental.
Um worker pode executar um arquivo
NodeJS ou uma Template String passada como
parâmetro. A thread principal e suas threads "filhas" se
comunicam através do objeto parentPort, enviando e
recebendo mensagens.
Mas NodeJS não
era single-
thread?
Então...
Quando utilizar Addons e
quando utilizar Workers?
● Como criar código assíncronno (de
verdade) em NodeJS?
○ Addons
○ Workers
○ Quando utilizar Workers e quando
utilizar Addons
● Coding time
Async
1. Você precisa (e pode) executar uma
tarefa em paralelo?
2. Seu projeto faz algum processamento
muito lento?
3. Sua equipe domina C/C++ ?
● Como criar código assíncronno (de
verdade) em NodeJS?
○ Addons
○ Workers
○ Quando utilizar Workers e quando
utilizar Addons
● Coding time
Async
Referência
● https://github.com/rhuankarlus/talks/
● Node.js C++ Addons
● Node.js Worker Threads
● Understanding Worker Threads in Node.js
● How to Use Node.js C++ Addons - A Step-by-Step Tutorial
● The Node.js Event Loop, Timers, and process.nextTick()
● Morning Keynote- Everything You Need to Know About Node.js
Event Loop - Bert Belder, IBM
THANKS!

Mais conteúdo relacionado

Mais procurados

Uma visão rápida sobre Nodejs
Uma visão rápida sobre NodejsUma visão rápida sobre Nodejs
Uma visão rápida sobre Nodejs
Rafael Soares
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
Rodrigo Branas
 
O que é nodejs, cases e vantagens
O que é nodejs, cases e vantagensO que é nodejs, cases e vantagens
O que é nodejs, cases e vantagens
Rodrigo Matheus
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
Caio Cutrim
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
Laís Lima
 
Nodejs justdigital
Nodejs justdigitalNodejs justdigital
Nodejs justdigital
Just Digital
 
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Renato Groff
 
Laravel + Vue: Como começar
Laravel + Vue: Como começarLaravel + Vue: Como começar
Laravel + Vue: Como começar
Leandro Ferreira
 
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael ToledoCompartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
iMasters
 
Node JS - Parte 1
Node JS - Parte 1Node JS - Parte 1
Node JS - Parte 1
Bruno Catão
 
Programação para Web II: NodeJS
Programação para Web II:  NodeJSProgramação para Web II:  NodeJS
Programação para Web II: NodeJS
Alex Camargo
 
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
Evandro Silvestre
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
Evandro Silvestre
 
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Renato Groff
 
ASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e Azure
Giovanni Bassi
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7
tdc-globalcode
 
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NETTDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
tdc-globalcode
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
Mario Guedes
 
9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem
Fernando Henriques
 
Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019
Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019
Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019
Renato Groff
 

Mais procurados (20)

Uma visão rápida sobre Nodejs
Uma visão rápida sobre NodejsUma visão rápida sobre Nodejs
Uma visão rápida sobre Nodejs
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
O que é nodejs, cases e vantagens
O que é nodejs, cases e vantagensO que é nodejs, cases e vantagens
O que é nodejs, cases e vantagens
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
 
Nodejs justdigital
Nodejs justdigitalNodejs justdigital
Nodejs justdigital
 
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
 
Laravel + Vue: Como começar
Laravel + Vue: Como começarLaravel + Vue: Como começar
Laravel + Vue: Como começar
 
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael ToledoCompartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
 
Node JS - Parte 1
Node JS - Parte 1Node JS - Parte 1
Node JS - Parte 1
 
Programação para Web II: NodeJS
Programação para Web II:  NodeJSProgramação para Web II:  NodeJS
Programação para Web II: NodeJS
 
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
 
ASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e Azure
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7
 
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NETTDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem
 
Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019
Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019
Docker: primeiros passos - Semana FCI - Mackenzie - Outubro-2019
 

Semelhante a NodeJS Under the Hood - Concurrency and Multithreading

ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
Giovanni Bassi
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
Michael Cardoso
 
Minicurso Node-RED.pdf
Minicurso Node-RED.pdfMinicurso Node-RED.pdf
Minicurso Node-RED.pdf
LuizGuilherme949739
 
Mean Stack
Mean StackMean Stack
Mean Stack
Bruno Catão
 
Programação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebProgramação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente Web
Israel Messias
 
Desenvolvendo com IONIC
Desenvolvendo com IONICDesenvolvendo com IONIC
Desenvolvendo com IONIC
Michel Anderson Lütz Teixeira
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
Elmano Cavalcanti
 
Node.js
Node.jsNode.js
Node.js
luizhse
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm Server
Dr. Spock
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
Rodrigo Urubatan
 
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWSAcelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Amazon Web Services LATAM
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Daniel Makiyama
 
Google App Engine e PHP
Google App Engine e PHPGoogle App Engine e PHP
Google App Engine e PHP
Luiz Messias
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
Flávio Lisboa
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com Docker
Wellington Silva
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
Éverton Ribeiro
 
TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?
tdc-globalcode
 
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP SnifferSeguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
Vinicius Warto Campos
 
Desenvolvimento de aplicações mobile com bootstrap, cordova e vue.js
Desenvolvimento de aplicações mobile com bootstrap, cordova e vue.jsDesenvolvimento de aplicações mobile com bootstrap, cordova e vue.js
Desenvolvimento de aplicações mobile com bootstrap, cordova e vue.js
Gustavo Castro
 
Open4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourceOpen4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSource
tdc-globalcode
 

Semelhante a NodeJS Under the Hood - Concurrency and Multithreading (20)

ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Minicurso Node-RED.pdf
Minicurso Node-RED.pdfMinicurso Node-RED.pdf
Minicurso Node-RED.pdf
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Programação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebProgramação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente Web
 
Desenvolvendo com IONIC
Desenvolvendo com IONICDesenvolvendo com IONIC
Desenvolvendo com IONIC
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Node.js
Node.jsNode.js
Node.js
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm Server
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWSAcelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
Google App Engine e PHP
Google App Engine e PHPGoogle App Engine e PHP
Google App Engine e PHP
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com Docker
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
 
TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?
 
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP SnifferSeguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
 
Desenvolvimento de aplicações mobile com bootstrap, cordova e vue.js
Desenvolvimento de aplicações mobile com bootstrap, cordova e vue.jsDesenvolvimento de aplicações mobile com bootstrap, cordova e vue.js
Desenvolvimento de aplicações mobile com bootstrap, cordova e vue.js
 
Open4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourceOpen4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSource
 

NodeJS Under the Hood - Concurrency and Multithreading

  • 1. SHARKTOWER A I - D R I V E N P R O J E C T M A N A G E M E N T
  • 2. NodeJS Under the Hood Concorrência e Multithreading
  • 3. Apresentação Raphael Ferreira Engenheiro de Software - Sharktower Cursando Engenharia de Software - UFG Rhuan Karlus DevOps Lead Core Team - Sharktower Cursando Engenharia de Computação - UFG
  • 4. O que é NodeJS
  • 5.
  • 6.
  • 7. Seu Código V8 Core Modules C++ Bindings libuv http-parser, c-ares, OpenSSL, zlib Sistema Operacional
  • 9. ● Tradutor / JS Engine (Just in Time Compiler) ● Garbage Collection ● Não é responsável por file system, http requests, console, DOM V8
  • 10. ● Event-driven Asynchronous i/o Model ● Network i/o, File i/o, DNS … ● Timers ● Thread Pool (4) ● Event Loop libuv
  • 11. V8 executa seu código dentro do event loop em apenas uma thread
  • 12. Event Loop Timers Pending Callbacks Poll for I/O Check Close callbacks Incoming: connections, data, etc resource: https://nodejs.org/uk/docs/guides/event-loop-timers-and-nexttick/
  • 13. setTimeout setInterval I/O Magic setImmediate close events resource: Bert Belder talk https://www.youtube.com/watch?v=PNa9OMajw9w index.js process#exit
  • 14. resource: Bert Belder talk https://www.youtube.com/watch?v=PNa9OMajw9w callback nextTick callback Promise Resolve
  • 15. Timer Heap Sistema Operacional Thread Pool index.js process#exit
  • 20. Async
  • 21. ● Como criar código assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async
  • 22. ● Como criar código assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async Você pode criar um Addon, que faz uso do threadpool disponibilizado pela LibUV, ou você pode criar um Worker (node -v 10+) que faça seu processamento em paralelo, enquanto o Event Loop continua desbloqueado para tratar qualquer requisição que o servidor receba.
  • 24. ● Como criar código assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async > https://nodejs.org/api/addons.html#addons_c_addons Um Addon é um objeto compartilhado dinamicamente linkado que pode ser escrito em C ou C++. A função require() pode carregar um Addon como um módulo NodeJS qualquer.
  • 25. Ok, mas como criar um Addon?
  • 26. Ok, mas como criar um Addon? 1. Crie um arquivo escrito em C ou C++ 2. Instale o módulo node-gyp globalmente 3. Crie o arquivo binding.gyp que mapeia o diretório de addons e como eles devem ser importados. 4. No terminal: node-gyp configure build 5. Dentro de algum código JS: const addonModule = require("<build-folder-path>/Release/<addon-name>"); 6. addonModule.function(params)
  • 28. ● Como criar código assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async https://nodejs.org/api/worker_threads.html#worker_threa ds_worker_threads Um Worker é uma thread que executa código JS em paralelo. O módulo worker_threads foi lançado na versão 10 com estabilidade experimental. Um worker pode executar um arquivo NodeJS ou uma Template String passada como parâmetro. A thread principal e suas threads "filhas" se comunicam através do objeto parentPort, enviando e recebendo mensagens.
  • 29. Mas NodeJS não era single- thread?
  • 31. Quando utilizar Addons e quando utilizar Workers?
  • 32. ● Como criar código assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async 1. Você precisa (e pode) executar uma tarefa em paralelo? 2. Seu projeto faz algum processamento muito lento? 3. Sua equipe domina C/C++ ?
  • 33. ● Como criar código assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async
  • 34. Referência ● https://github.com/rhuankarlus/talks/ ● Node.js C++ Addons ● Node.js Worker Threads ● Understanding Worker Threads in Node.js ● How to Use Node.js C++ Addons - A Step-by-Step Tutorial ● The Node.js Event Loop, Timers, and process.nextTick() ● Morning Keynote- Everything You Need to Know About Node.js Event Loop - Bert Belder, IBM