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!

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 theHood Concorrência e Multithreading
  • 3.
    Apresentação Raphael Ferreira Engenheiro deSoftware - Sharktower Cursando Engenharia de Software - UFG Rhuan Karlus DevOps Lead Core Team - Sharktower Cursando Engenharia de Computação - UFG
  • 4.
    O que éNodeJS
  • 7.
    Seu Código V8 Core Modules C++Bindings libuv http-parser, c-ares, OpenSSL, zlib Sistema Operacional
  • 8.
  • 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 Asynchronousi/o Model ● Network i/o, File i/o, DNS … ● Timers ● Thread Pool (4) ● Event Loop libuv
  • 11.
    V8 executa seucódigo dentro do event loop em apenas uma thread
  • 12.
    Event Loop Timers Pending Callbacks Poll forI/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 Beldertalk https://www.youtube.com/watch?v=PNa9OMajw9w index.js process#exit
  • 14.
    resource: Bert Beldertalk https://www.youtube.com/watch?v=PNa9OMajw9w callback nextTick callback Promise Resolve
  • 15.
    Timer Heap Sistema Operacional ThreadPool index.js process#exit
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
    ● Como criarcódigo assíncronno (de verdade) em NodeJS? ○ Addons ○ Workers ○ Quando utilizar Workers e quando utilizar Addons ● Coding time Async
  • 22.
    ● Como criarcó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.
  • 23.
  • 24.
    ● Como criarcó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.
  • 26.
    Ok, mas como criarum 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)
  • 27.
  • 28.
    ● Como criarcó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 erasingle- thread?
  • 30.
  • 31.
    Quando utilizar Addonse quando utilizar Workers?
  • 32.
    ● Como criarcó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 criarcó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.jsC++ 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
  • 35.