Slide 1

Slide 1 text

ESTRATÉGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS JÉSSICA FÉLIX (JESSILYNEH)

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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.

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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.

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

"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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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/

Slide 17

Slide 17 text

@jessilyneh ESTRATEGIAS PARA ESCALABILIDADE HORIZONTAL COM NODE.JS https://www.youtube.com/live/f7MY2OtI7nA?si=hQ0TzILUeRN8o35U

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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.

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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