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

Melhores práticas de desempenho com NodeJs em produção

Melhores práticas de desempenho com NodeJs em produção

Como fazemos quando nossa aplicação não está colaborando? Esta é uma série de explicações e dicas para resolver esse problema!

Lucas Santos

April 08, 2019
Tweet

More Decks by Lucas Santos

Other Decks in Programming

Transcript

  1. Maiores causas de problemas - Muito processamento desnecessário - Má

    codificação - Conteúdo estático - Uso indevido do Node - Aumento de tráfego repentino
  2. Maiores causas de problemas - Muito processamento desnecessário - Má

    codificação - Conteúdo estático - Uso indevido do Node - Aumento de tráfego repentino (Event Loop)
  3. Maiores causas de problemas - Muito processamento desnecessário - Má

    codificação - Conteúdo estático - Uso indevido do Node - Aumento de tráfego repentino (C10K)
  4. Se der, cacheia, senão, também • Cachear arquivos estáticos •

    Cachear chamadas de API ◦ Por rota ◦ Por hash de IP • Cachear retornos de DB • Cachear arquivos gerados por SSR • Pode ser implementado via Infra (NGINX) ou via código (Ex: Catbox-redis)
  5. Um proxy, só que ao contrário Remove a carga de

    conexões do node Permite escalabilidade de aplicações Debounce de conexões
  6. Balanceando carga - Escalabilidade próxima de infinita - Três tipos

    de roteamento - Round Robin - Least Conn - IP Hash
  7. The good, the bad and the /1.1 Chamadas síncronas uma

    a uma O mesmo domínio só pode responder a uma request por vez Bloqueio HOL (Head of Line)
  8. The good, the bad and the /2 Multiplexing Menos conexões

    simultâneas Mais performance Compressão Server push Keep Alive
  9. Você FAZ diferença - Código mais leve roda melhor -

    Tomar cuidado com consumo de memória - Evitar funções complexas (principalmente loops) - Regra das 80 colunas - Use menos libs
  10. A guerra dos loops Loops são as funções mais custosas

    que se pode ter Adição de complexidade Muitas vezes contornáveis
  11. A guerra dos loops Loops são as funções mais custosas

    que se pode ter Adição de complexidade Muitas vezes contornáveis CodeMetrics
  12. Voltando às origens - Execução paralela de todos os caminhos

    possíveis (cuidado!) - Menos complexidade - Menos linhas de código - Repetição de keywords - Dinâmico
  13. Segura aí que já volto - Não bloqueia o processamento

    - Impacto em tempo é pequeno - Otimiza o uso de recursos
  14. Tudo junto! Executa múltiplas ações ao mesmo tempo Simula um

    “multi-core” Ações independentes Evite promise-chaining Não é paralelo!
  15. Se der, cacheia, senão, também² • Cachear arquivos estáticos •

    Cachear chamadas de API ◦ Por rota ◦ Por hash • Cachear retornos de DB • Cachear arquivos gerados por SSR • Service Workers • Pode ser implementado via Infra (NGINX) ou via código (Ex: Catbox-redis)
  16. Será que vale? Processamento muito intenso do lado do servidor

    Bom para páginas pequenas Distribua o processamento no cliente É uma boa prática dependendo do caso
  17. Clusters - Utilizam o processamento multi núcleo - Nativo do

    Node! - Simples e fácil - Estável https://nodejs.org/api/cluster.html
  18. Use mais o V8! Não use Lodash Não use Lodash

    Não use Lodash Não use Lodash Não use Lodash Não use Lodash Não use Underscore Não use Underscore Não use Underscore Não use Underscore Não use jQuery Não use jQuery Não use jQuery Não use Underscore Não use jQuery
  19. POR… QUE? - Libs são úteis em casos específicos, use

    nesses casos… - Pensadas para o browser (muito código inútil)
  20. Outras coisinhas - Gerenciamento de sessões ocupa memória - Utilize

    projeção no banco de dados - Use plataformas de monitoramento
  21. O que é um e o que é outro? Worker

    - Sempre ativo na máquina - Roda por eventos disparados de fora - Consome mais memória (fica ligado direto) - Mais propenso a memory leak Job - Fica inativo - Roda apenas em horários ou intervalos determinados (CronJob) - Consome memória em picos
  22. Yes, we have GC - Node tem um garbage collector

    - Funciona após 1.4Gb de memória ocupada (Heap Limit do V8) - Dividido em Old Space e New Space (???) https://blog.risingstack.com/finding-a-memory-leak-in-node-js/
  23. Garbage Collection in depth Deletamos um obj. GC Roda Perdeu

    Root = Memória não usada New Space Old Space
  24. Garbage Collection in depth Deletamos um obj. GC Roda Perdeu

    Root = Memória não usada New Space Old Space MUITO CUIDADO