Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Escalabilidade e Alta Disponibilidade com Node.js

Escalabilidade e Alta Disponibilidade com Node.js

Vinicius Reis

November 19, 2019
Tweet

More Decks by Vinicius Reis

Other Decks in Programming

Transcript

  1. Vinicius Reis @vinicius73 @LuizVinicius73 Gravo aulas sobre Vue.js, JavaScript e

    Laravel para codecasts.com.br Claro Controle @ M4U @vinicius73
  2. Node.js é single thread Um serviço node é por padrão

    um único processo, uma única thread. Process Execution CPU
  3. 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
  4. 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”
  5. 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/
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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.
  11. 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.
  12. 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.
  13. 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.
  14. 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
  15. 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
  16. 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.