Slide 1

Slide 1 text

Escalabilidade e Alta Disponibilidade com Node.js

Slide 2

Slide 2 text

Vinicius Reis @vinicius73 @LuizVinicius73 Gravo aulas sobre Vue.js, JavaScript e Laravel para codecasts.com.br Claro Controle @ M4U @vinicius73

Slide 3

Slide 3 text

A base de tudo

Slide 4

Slide 4 text

Node.js é single thread Um serviço node é por padrão um único processo, uma única thread. Process Execution CPU

Slide 5

Slide 5 text

E as operações assíncronas?

Slide 6

Slide 6 text

Primeiro, devemos entender um pouco de como o JavaScript é executado.

Slide 7

Slide 7 text

Call Stack Cada chamada de função/operação gera uma entrada na callstack do motor do JavaScript. Essa pilha de execução enche e esvazia conforme a aplicação é executada, de forma síncrona. Memory Heap Call Stack

Slide 8

Slide 8 text

Callback Queue Uma pilha de execução similar a call stack, porém sua execução é assíncrona. Callback Queue Memory Heap Call Stack Conforme a callback queue “esvazia”, a call stack “enche”

Slide 9

Slide 9 text

Event Loop O Event Loop é o responsável por coletar esses eventos e adicioná-los a call stack. Callback Queue Call Stack Event Loop Referências: https://bit.ly/33Rn3CX Veja funcionando: http://latentflip.com/loupe/

Slide 10

Slide 10 text

Operações Bloqueantes

Slide 11

Slide 11 text

Operações Bloqueantes Apesar dessas características, as operações executadas no JavaScript são concorrentes. Ou seja, concorrem entre si para saber em que momento podem ser executadas. Apenas uma operação ocorre por vez. https://bit.ly/32SAP6Q

Slide 12

Slide 12 text

Código bloqueante impacta na performance de aplicações http

Slide 13

Slide 13 text

Teste de carga Uma simples operação bloqueante de 5 segundos foi capaz de prejudicar a performance da aplicação em 99,96% Sem Blocking Com Blocking (5s) 51.415 req/10s 18 req/10s 5145 req/s 1,8 req/s https://bit.ly/2CTdpDL

Slide 14

Slide 14 text

- Node.js Cluster Mode -

Slide 15

Slide 15 text

Node.js Cluster Mode Um cluster é resumidamente um processo que age como balanceador de carga para subprocessos. Sub Process Sub Process Sub Process Sub Process Main Process / Service

Slide 16

Slide 16 text

Node.js Cluster Mode Cluster não é multi-thread. Cada processo ainda sofrerá com ações bloqueantes, entretanto o balanceador de carga terá como distribuir as requisições paralelas em outros processos enquanto um estiver “ocupado”. Sub Process Sub Process Sub Process Sub Process Main Process / Service m ulti-thread

Slide 17

Slide 17 text

Como?

Slide 18

Slide 18 text

PM2 https://pm2.keymetrics.io/

Slide 19

Slide 19 text

Só isso?

Slide 20

Slide 20 text

Definitivamente não!

Slide 21

Slide 21 text

Escalabilidade + CPU +Memória ... Vertical Horizontal +Máquinas / +Instâncias Uma estratégia de escalabilidade deve ser tomada para garantir performance e disponibilidade da aplicação.

Slide 22

Slide 22 text

Escalabilidade Vertical + CPU +Memória ... Vertical Se resume a aumentar as capacidades de uma única instância / máquina onde a aplicação é executada. Apesar de simples, tem custos elevados no longo prazo, e não garante disponibilidade.

Slide 23

Slide 23 text

Escalabilidade Horizontal Horizontal +Máquinas / +Instâncias Ao optar por incrementar a quantidade de máquinas / instâncias de uma aplicação haverá uma maior disponibilidade. Caso uma máquina falhe, a aplicação continuará disponível.

Slide 24

Slide 24 text

Escalabilidade Horizontal Horizontal +Máquinas / +Instâncias Esta estratégia garante uma maior disponibilidade. Caso uma máquina falhe, a aplicação continuará disponível.

Slide 25

Slide 25 text

Escalabilidade Horizontal Nesta arquitetura, as requisições não chegam diretamente nas instâncias. Um balanceador de carga é o responsável por determinar para onde a requisição deve ir. A B C D E F Load Balancer Requests

Slide 26

Slide 26 text

Escalabilidade Horizontal IMPORTANTE: Recursos como banco, cache entre outros, devem ser compartilhados entre as instâncias. A B C D E F Load Balancer Recursos compartilhados

Slide 27

Slide 27 text

Como?

Slide 28

Slide 28 text

Docker

Slide 29

Slide 29 text

Orquestradores São ferramentas responsáveis por criar e criar novas instâncias.

Slide 30

Slide 30 text

Conclusão Apesar de suas particularidades, com alguns ajustes, Node.js (e outras soluções) têm a capacidade de escalar e entregar alta disponibilidade.

Slide 31

Slide 31 text

Obrigado!