Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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. Escalabilidade e
    Alta Disponibilidade
    com Node.js

    View Slide

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

    View Slide

  3. A base de tudo

    View Slide

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

    View Slide

  5. E as operações assíncronas?

    View Slide

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

    View Slide

  7. 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

    View Slide

  8. 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”

    View Slide

  9. 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/

    View Slide

  10. Operações Bloqueantes

    View Slide

  11. 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

    View Slide

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

    View Slide

  13. 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

    View Slide

  14. - Node.js Cluster Mode -

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. Como?

    View Slide

  18. PM2
    https://pm2.keymetrics.io/

    View Slide

  19. Só isso?

    View Slide

  20. Definitivamente não!

    View Slide

  21. 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.

    View Slide

  22. 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.

    View Slide

  23. 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.

    View Slide

  24. 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.

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

  27. Como?

    View Slide

  28. Docker

    View Slide

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

    View Slide

  30. 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.

    View Slide

  31. Obrigado!

    View Slide