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

Estratégias de escalabilidade horizontal com No...

Jessilyneh
September 01, 2023

Estratégias de escalabilidade horizontal com Node.js

Aprenda estratégias para distribuir a carga de trabalho entre vários servidores Node.js, maximizando a capacidade de atender a um grande número de solicitações. Você vai conhecer técnicas de balanceamento de carga, particionamento de dados e uso de clusters para alcançar um melhor desempenho. O objetivo é ajudar você a enfrentar desafios de crescimento e melhorar a experiência de quem usa suas aplicações :)

Jessilyneh

September 01, 2023
Tweet

More Decks by Jessilyneh

Other Decks in Programming

Transcript

  1. Eu sou a Jess Sou desenvolvedora de Software há 8

    anos. Trabalho na área faz 6 anos. I .T. Architect II na F1rst (Grupo Santander) Tech Lead na ONG Lacrei Saúde Instrutora de Javascript na Linux Tips Organizadora na comunidade Nerdzão ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS @jessilyneh
  2. Introdução a escalabilidade Um sistema é escalável quando o desempenho

    aumenta com o acréscimo de hardware, proporcionalmente à capacidade acrescida. É a capacidade de manipular uma porção crescente de trabalho de maneira uniforme, ou estar preparado para crescer. @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS https://pt.wikipedia.org/wiki/Escalabilidade
  3. The Scale Cube @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS

    Este cubo é descrito no livro de Martin Abbott e Michael Fisher, The Art of Scalability (Addison-Wesley, 2015).
  4. Escalabilidade vertical e escalabilidade horizontal @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL

    COM NODE.JS Adicionar mais máquinas ou nós Adicionar mais poder aos recursos existentes
  5. Escalabilidade horizontal @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Cenários

    com grande quantidade de solicitações simultâneas, como jogos online, aplicativos de mensagens e redes sociais Escalabilidade vertical Carga de trabalho é “menor” ou mais previsível, como sites de comércio eletrônico ou blogs A consistência dos dados pode ser um desafio há um limite para a quantidade de recursos que podem ser adicionados a uma única máquina Pode aumentar a latência e a sobrecarga de rede Se a máquina falhar, todo o sistema pode ficar indisponível.
  6. Não há nenhum padrão arquitetural que impeça a escalabilidade de

    um sistema MAS algumas arquiteturas podem tornar a escalabilidade mais difícil, mais cara ou menos eficiente. @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS
  7. Padrões arquiteturais: @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Event-driven:

    usa eventos para disparar e comunicar entre serviços desacoplados Microservices: Permite que um aplicativo grande seja separado em partes independentes menores, com cada parte tendo sua própria área de responsabilidade. Modular: Divide um sistema em componentes menores e independentes, os módulos. Cada módulo é independente e pode ser testado separadamente antes de integrar o sistema todo. N-Layers: Divide um aplicativo em camadas lógicas e camadas físicas. As camadas são uma forma de separar responsabilidades e gerenciar dependências.
  8. Arquitetura que permita a adição de recursos Módulos independentes e

    fracamente acoplados Processos flexíveis para lidar com variação de carga Escalabilidade geográfica Tolerância a falhas, recuperação rápida, mantendo a integridade estrutural e a segurança dos dados Requisitos de escalabilidade @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS
  9. "Alta performance e escalabilidade podem não ser requisitos de qualidade

    prioritários para muitos sistemas que construímos. Mas ás vezes, impulsionados por eventos externos inesperados como sucesso, escalar se torna necessário. Isso se torna um ponto de inflexão onde as decisões do projeto que faziam sentido sob cargas mais leves, viram débito técnico automaticamente." @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Ian Gordon, Six Rules of Thumb for Scaling Software Architectures-2020
  10. A escalabilidade deve ser considerada desde o planejamento e design

    do sistema porque decisões tomadas durante a codificação e nas fases iniciais do projeto podem dificultar. @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS
  11. Porque usar Node.js para aplicações escaláveis? @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE

    HORIZONTAL COM NODE.JS Utiliza uma arquitetura baseada em eventos e não bloqueante, o que permite que o Node.js lide com um grande número de conexões simultâneas de forma eficiente É multiplataforma, pode ser executado em vários sistemas operacionais, incluindo Windows, Linux e macOS Node.js foi projetado para construir aplicativos distribuídos com muitos nós. É por isso que se chama “Node”. https://medium.com/edge-coders/node-js-child-processes-everything-you-need-to-know-e69498fe970a
  12. Event-driven (arquitetura baseada em eventos) @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL

    COM NODE.JS Eventos podem ser solicitações HTTP, operações do sistema de arquivos, timers ou eventos personalizados acionados pelo aplicativo. Esses eventos são registrados com retornos de chamada associados e, quando ocorre um evento, o retorno de chamada correspondente é executado de forma assíncrona. https://www.educative.io/answers/what-is-the-event-driven-non-blocking-i-o-model-in-node-js https://medium.com/swlh/non-blocking-event-driven-model-of-node-js-explained-using-real-world-analogies-4561cc4a7e52
  13. Não bloqueante @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Bloqueante

    cada operação é executada sequencialmente, fazendo com que o programa aguarde a conclusão de cada tarefa antes de passar para a próxima. Exemplos: ler arquivos ou fazer solicitações de rede A execução do programa continua sem esperar o término da operação de I/O. Quando a operação é concluída, um retorno de chamada é acionado para tratar o resultado. O Node JS pode lidar com muitas conexões simultâneas de forma eficiente devido à sua natureza não bloqueante, ideal para a construção de aplicativos de alto desempenho. https://www.educative.io/answers/what-is-the-event-driven-non-blocking-i-o-model-in-node-js
  14. single-threaded event loop architecture @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM

    NODE.JS https://medium.com/preezma/node-js-event-loop-architecture-go-deeper-node-core-c96b4cec7aa4
  15. Worker threads @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Um

    processo Várias threads Um event loop por thread Uma instância do JS Engine por thread Uma instância Node.js por thread https://nodesource.com/blog/worker-threads-nodejs/
  16. Node.js foi projetado para construir aplicativos distribuídos com muitos nós.

    É por isso que se chama “Node”! @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Samer Buna
  17. Partindo do principio que a aplicação esteja seguindo o padrão

    arquitetural mais adequado para os requisitos de escalabilidade, vamos as estratégias! @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Cloning Clustering Decomposing Spliting Broadcasting Messages Load balancing Caching Database Optimization
  18. Cloning @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Várias instâncias

    do aplicativo são executadas por trás de um load balancer - balanceador de carga. www.tdc.com.br Load Balancer Instancia 1 Instancia 2 Instancia 3 Cliente
  19. Fork( ) @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Faz

    parte do módulo child process, nos permite bifurcar o processo principal do aplicativo quantas vezes tivermos núcleos de CPU Exemplo retirado de “Advanced Node.js: Scaling Applications“, de Alex Banks
  20. Clustering @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS https://www.infoq.com/br/articles/nodejs-utilizando-modulo-de-cluster/ o

    módulo de cluster distribui as requisições, atuando como um balanceador de carga para os workers cria processos filhos a partir do principal utilizando o método child_process.fork() e estabelece uma comunicação de 2 vias entre os processos via IPC (Inter Process Communication) Uma Aplicação Web Node.js simples
  21. Data Partitioning @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS https://federicomete.medium.com/database-partitioning-2c00da4ffd0b

    Também podemos dividir a aplicação em múltiplas instâncias onde cada instância é responsável por apenas uma parte dos dados da aplicação.
  22. The Scale Cube @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS

    Cloning Load Balancing Modulo Cluster Decomposing Data Partioning Broadcasting Messages Martin Abbott e Michael Fisher, The Art of Scalability (Addison-Wesley, 2015).
  23. @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS Cloning: permite bifurcar

    o processo principal quantas vezes tivermos núcleos de CPU Modulo Cluster: assume e equilibra a carga de todas as solicitações do processo principal em todos os processos bifurcados. Decomposing: Vários aplicativos diferentes com diferentes bases de código e, às vezes, com seus próprios bancos de dados e interfaces de usuário dedicados, como microserviços. Spliting: dividir o aplicativo em várias instâncias, onde cada instância é responsável por apenas uma parte dos dados do aplicativo Broadcasting Messages: Como temos canais de comunicação entre o processo principal e os workers, para transmitir uma mensagem precisamos apenas de um simples loop sobre todos os workers.
  24. Beanchmark de escalabilidade horizontal @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM

    NODE.JS “Tente resistir ao impulso de aumentar a CPU do seu serviço. Em vez disso, aumente o número de instancias. Isso manterá o custo do seu aplicativo sob controle e também aumentará sua resiliência. Você também deve dimensionar automaticamente seu aplicativo, mas tenha cuidado ao usar o tempo de resposta ou solicitações simultâneas, pois isso pode proporcionar uma experiência ruim aos seus clientes.” https://github.com/HarryEMartland/node-scaling-experiment
  25. Dicas adicionais - Livros @jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM

    NODE.JS Build Scalable Apps with Redis and Node.js Joshua Johanan Deploying Node.js Sandro Pasquali Aplicações Real Time com Node.js Caio Ribeiro Pereira