Slide 1

Slide 1 text

ESTRATÉGIAS DE ESCALABILIDADE PARA PROJETOS WEB: LIÇÕES APRENDIDAS JÉSSICA FÉLIX (@JESSILYNEH)

Slide 2

Slide 2 text

Se você é uma startup, se está fazendo menos de uma request por segundo, não há nenhuma razão para criar discussões neste ponto do ciclo de vida da sua aplicação, com todos os prós e contras de construir uma empresa inovadora e brilhante, com um sistema de produção rápido, porque você tem outras coisas com que se preocupar, como sobreviver nos negócios. The Joy of Building Large Scale Systems Suhail Patel @jessilyneh

Slide 3

Slide 3 text

Introdução à escalabilidade É a capacidade de lidar com uma parcela crescente de trabalho de forma consistente ou de estar preparado para crescer. flexível tolerante a falhas Desempenho consistente baixa latência de resposta @jessilyneh

Slide 4

Slide 4 text

the scale cube Este cubo é descrito no livro de Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). @jessilyneh

Slide 5

Slide 5 text

the scale cube Este cubo é descrito no livro de Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). the scale cube Este cubo é descrito no livro de Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). @jessilyneh

Slide 6

Slide 6 text

the scale cube Este cubo é descrito no livro de Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). @jessilyneh

Slide 7

Slide 7 text

the scale cube Este cubo é descrito no livro de Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). @jessilyneh

Slide 8

Slide 8 text

Escala vertical e escala horizontal Adicione mais máquinas ou nós Adicione mais poder aos recursos existentes @jessilyneh

Slide 9

Slide 9 text

Escalabilidade vertical Há um limite para o número de recursos que podem ser adicionados a uma única máquina. A carga de trabalho é “menor” ou mais previsível, como sites pequenos de comércio eletrônico ou blogs. Se a máquina falhar, todo o sistema poderá ficar indisponível. @jessilyneh

Slide 10

Slide 10 text

Escalabilidade horizontal Cenários com grande quantidade de solicitações simultâneas, como jogos online, aplicativos de mensagens e redes sociais. A consistência dos dados pode ser um desafio Pode aumentar a latência e a sobrecarga da rede @jessilyneh

Slide 11

Slide 11 text

“Alto desempenho e escalabilidade podem não ser requisitos de qualidade prioritários para muitos dos sistemas que construímos. Mas por vezes, impulsionado por acontecimentos externos inesperados, como o sucesso, a expansão torna-se necessária. Isto se torna um ponto de inflexão onde as decisões de projeto que faziam sentido sob cargas mais leves automaticamente se tornam uma dívida técnica.” Ian Gordon, Seis regras básicas para dimensionar arquiteturas de software-2020 @jessilyneh

Slide 12

Slide 12 text

Requisitos de escalabilidade Arquitetura que permite a adição de recursos. Módulos independentes e fracamente acoplados. Processos flexíveis para lidar com variações de carga Escalabilidade geográfica Tolerância a falhas, recuperação rápida, manutenção da integridade estrutural e segurança dos dados. @jessilyneh

Slide 13

Slide 13 text

https://www.infoq.com/presentations/building-large-scale-systems/ The Joy of Building Large Scale Systems @jessilyneh

Slide 14

Slide 14 text

Importância do Desempenho de Thread Único Mesmo com a adição de mais núcleos e threads, ainda é possível extrair desempenho significativo de um único thread. Isso é importante porque muitos aplicativos e sistemas ainda dependem de operações que não podem ser facilmente paralelizadas, ou seja, que não podem ser divididas em múltiplas threads. @jessilyneh

Slide 15

Slide 15 text

https://kishoreconnect.com/u nderstanding-processes- threads-and-cpu-cores @jessilyneh

Slide 16

Slide 16 text

https://kishoreconnect.com/understanding-processes-threads-and-cpu-cores @jessilyneh

Slide 17

Slide 17 text

https://kishoreconnect.com/understanding-processes-threads-and-cpu-cores Um processo contém: O código executável Memória para armazenar o código, Dados de entrada/saída, Pilha de chamadas de função Heap para alocação dinâmica Descritores de sistema operacional como arquivos abertos e permissões de segurança Contexto de estado do processador como conteúdo dos registradores @jessilyneh

Slide 18

Slide 18 text

Recursos de Memória em um Processo Memória RAM para armazenar o código, dados e pilha do processo. A RAM é uma memória volátil de acesso rápido. Memória Cache do processador para armazenar dados e instruções acessadas frequentemente. A cache é dividida em níveis (L1, L2, L3) e é muito mais rápida que a RAM. Memória Virtual no disco rígido que estende a capacidade da RAM. Ela usa parte do espaço de armazenamento para simular memória adicional, permitindo que o sistema operacional gerencie a memória de forma mais eficiente. @jessilyneh

Slide 19

Slide 19 text

https://www.allaboutcircuits.com/technical-articles/what-is-virtual-memory/ Recursos de Memória em um Processo @jessilyneh

Slide 20

Slide 20 text

Núcleos (Cores) são unidades de processamento físicas em um CPU. Threads são unidades lógicas de execução dentro de um núcleo. Processo é uma instância de um programa em execução @jessilyneh

Slide 21

Slide 21 text

Mechanical Sympathy Você não precisa ser engenheiro para ser piloto de corrida, mas precisa ter familiaridade com a mecânica do carro. Jackie Stewart,piloto de corrida @jessilyneh

Slide 22

Slide 22 text

Uma Visão Geral sobre Threads https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html Um thread é uma unidade básica de utilização da CPU, consistindo em um contador de programa, uma pilha e um conjunto de registros (e um ID de thread). @jessilyneh

Slide 23

Slide 23 text

Uma Visão Geral sobre Threads https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html Uso em atividades que possam ser executadas simultâneas e forneçam valor igual. Não desperdice threads em tarefas triviais. Divisão de dados - Para evitar que os threads interfiram uns com os outros. Se uma tarefa depende dos resultados de outra, então as tarefas precisam ser sincronizadas para garantir o acesso na ordem correta. Mais difícil debuggar de processamento paralelo, pois as race conditions se tornam muito mais complexas e difíceis de identificar. @jessilyneh

Slide 24

Slide 24 text

https://kishoreconnect.com/understanding-processes-threads-and-cpu-cores @jessilyneh

Slide 25

Slide 25 text

A resposta pode estar no seu hardware Os caches das CPUs (L1, L2 e L3) são áreas de armazenamento rápido que ajudam a acelerar o acesso a dados frequentemente usados. https://teivah.medium.com/go-and-cpu-caches-af5d32cc5592 @jessilyneh

Slide 26

Slide 26 text

A resposta pode estar no seu hardware O tamanhos dos caches aumentaram ao longo do tempo. Isso é relevante porque um cache maior pode melhorar a eficiência do acesso à memória, reduzindo o tempo que a CPU leva para buscar dados. https://hazelcast.com/glossary/caching/ @jessilyneh

Slide 27

Slide 27 text

Importância do Desempenho de Thread Único Otimize o código Use estruturas de dados eficientes que minimizem a sobrecarga e o tempo de acesso Aproveite os recursos da CPU, garantindo que o aplicativo seja executado em uma CPU de alta velocidade de clock. Minimize a troca de contexto (operações assíncronas excessivas) https://www.reddit.com/r/buildapc/comments/1dr4t4q/what_cpu_to_get_if_i_only_care_about_singlethread/ @jessilyneh

Slide 28

Slide 28 text

O artigo "The LMAX Architecture" de Martin Fowler explora a arquitetura de uma plataforma de negociação financeira chamada LMAX, que foi projetada para processar um grande volume de transações com baixa latência. The LMAX Architecture https://martinfowler.com/articles/lmax.html @jessilyneh

Slide 29

Slide 29 text

A arquitetura LMAX é um exemplo de como um design cuidadoso pode levar a melhorias significativas no desempenho, especialmente em sistemas que exigem alta taxa de transferência e baixa latência. A escolha de um modelo de thread único, combinada com o uso de disruptores e uma atenção cuidadosa ao gerenciamento de memória e cache, demonstra que soluções inovadoras podem desafiar as convenções tradicionais sobre concorrência e desempenho. https://martinfowler.com/articles/lmax.html The LMAX Architecture @jessilyneh

Slide 30

Slide 30 text

Princípios de Design para Aplicações Web Escaláveis Desacoplamento Design Orientado a Serviços Automação @jessilyneh

Slide 31

Slide 31 text

Desacoplamento Separar diferentes componentes e responsabilidades em módulos independentes que possam ser desenvolvidos, implantados e escalados de forma autônoma Dividir a aplicação em serviços autônomos que se comunicam através de APIs (Com ressalvas) Microsserviços (Com ressalvas) Dividir a lógica da aplicação em camadas distintas (apresentação, negócios, dados) que não dependem umas das outras @jessilyneh

Slide 32

Slide 32 text

Design Orientado a Serviços Cada serviço pode ser dimensionado separadamente de acordo com sua carga de trabalho específica Serviços podem ser implantados e atualizados independentemente, sem afetar outros componentes Diferentes tecnologias e linguagens de programação podem ser usadas em cada serviço, permitindo escolher a melhor ferramenta para o trabalho @jessilyneh

Slide 33

Slide 33 text

Automação Criar ambientes de produção e teste de forma automatizada usando ferramentas como Terraform, CloudFormation ou Ansible Automatizar o processo de implantar novos códigos em produção, reduzindo erros humanos Coletar métricas de desempenho e saúde da aplicação e gerar alertas proativos quando problemas são detectados Adicionar ou remover recursos dinamicamente com base na carga, usando ferramentas de orquestração de contêineres como Kubernetes @jessilyneh

Slide 34

Slide 34 text

Estratégias de Implementação para Escalabilidade (Com ressalvas) Adoção de Arquiteturas de Microsserviços Utilização de serviços de Cloud @jessilyneh

Slide 35

Slide 35 text

Quando migrar a sua arquitetura? @jessilyneh

Slide 36

Slide 36 text

Características de Arquiteturas de Microsserviços Cada microsserviço pode ser implantado de forma independente, permitindo que mudanças em um serviço não afetem diretamente os outros. Isso facilita atualizações e escalabilidade, pois as equipes podem trabalhar em diferentes serviços simultaneamente sem a necessidade de coordenar implantações de todo o sistema. @jessilyneh

Slide 37

Slide 37 text

MODERNIZAÇÃO DE LEGADO VALE A PENA? https://jonnyleroy.com/2011/02/03/dealing-with-creaky-legacy- platforms/ @jessilyneh

Slide 38

Slide 38 text

HTTPS://SPEAKERDECK.COM/ JESSILYNEH @jessilyneh

Slide 39

Slide 39 text

HTTPS://SPEAKERDECK.COM/ JESSILYNEH @jessilyneh

Slide 40

Slide 40 text

Utilização de Cloud Computing Implantar aplicações em plataformas de nuvem como IaaS (infraestrutura como serviço) Utilizar PaaS (plataforma como serviço) para abstrair a infraestrutura e focar no código da aplicação Adotar FaaS (funções como serviço) para executar pequenos blocos de código (funções) em resposta a eventos, com escalabilidade automática Utilizar contêineres e orquestradores como Docker e Kubernetes para empacotar e gerenciar aplicações de forma portável e escalável @jessilyneh

Slide 41

Slide 41 text

Desafios e Lições Aprendidas com Falhas de Escalabilidade @jessilyneh

Slide 42

Slide 42 text

Previsão Incorreta da Demanda Falta de Escalabilidade na Arquitetura Falta de Testes de Carga Quando o Twitter introduziu sua nova interface e recursos, a demanda de usuários aumentou rapido, resultando em instabilidade e falhas de serviço. Enfrentaram o famoso "fail whale", uma mensagem de erro que indicava que o serviço estava temporariamente indisponível devido à sobrecarga de tráfego. Lançamento do “New Twitter” (2010) https://techcrunch.com/2010/01/20/twitter-fail-whale/

Slide 43

Slide 43 text

Crescimento acelerado Arquitetura monolítica se tornou um problema Picos de demanda durante eventos grandes Testes de carga insuficientes Airbnb enfrentou problemas de escalabilidade em vários momentos ao longo de sua trajetória, especialmente em torno dos anos de 2011 a 2014. Em 2012, quando a empresa começou a expandir rapidamente suas operações, especialmente na Europa, e enfrentou dificuldades em manter a performance e a disponibilidade do serviço. Problemas no AirBnB (2012) https://techcrunch.com/2013/02/07/airbnbs-big-2012-4x-guest-growth-and-2x-the-number-of-listings-in-over-150-countries-worldwide/

Slide 44

Slide 44 text

Previsão Incorreta da Demanda Falta de Escalabilidade na Arquitetura Dependência de Servidores Centralizados Falta de Testes de Carga A empresa não previu corretamente a demanda e não projetou o jogo para ser escalável. Como resultado, os servidores ficaram sobrecarregados e os jogadores enfrentaram problemas generalizados de acesso, travamentos e frustrações O Lançamento Problemático de SimCity (2013)

Slide 45

Slide 45 text

Problemas de desempenho Indisponibilidade conforme o aumento de dados A Uber estava dependendo de um único banco de dados PostgreSQL para armazenar dados de viagens. Isso levou a Uber a desenvolver um novo armazenamento de dados de viagem chamado Schemaless, construído sobre o MySQL, para escalar horizontalmente, particionando dados em vários shards. Armazenamento de dados de viagem (2014) https://www.uber.com/en-GB/blog/scaling-hdfs/

Slide 46

Slide 46 text

Arquitetura obsoleta para necessidade do negócio Problemas de consistencia transacional Dificuldade para escalar por demanda Não suportavam novos casos de uso, como reservas, agrupamento, filas virtuais e mercados de múltiplos lados para o Uber Eats. Reescreveram a plataforma de atendimento do zero, aproveitando o Google Cloud Spanner como o mecanismo de armazenamento principal para atender aos requisitos de consistência transacional, escalabilidade horizontal e baixo overhead operacional. Mudança de arquitetura (2021)

Slide 47

Slide 47 text

Utilizar ferramentas de análise para entender padrões de uso e dimensionar recursos de acordo com expectativas de tráfego Realizar testes de carga para simular aumentos e identificar gargalos Monitorar métricas-chave como tempo de resposta, taxa de erros e utilização de recursos em tempo real Configurar alertas para notificar quando limites pré-definidos forem atingidos, permitindo intervenção proativa Testar planos de escalonamento automático para adicionar ou remover recursos conforme necessário Lições aprendidas @jessilyneh

Slide 48

Slide 48 text

https://breadcrumb.vc/marketplaces-scalability-lessons-from-uber-and-airbnb-d461aded18a2 @jessilyneh

Slide 49

Slide 49 text

https://www.uber.com/en-GB/blog/scaling-hdfs/ @jessilyneh

Slide 50

Slide 50 text

Estratégias de Crescimento Sustentável KPIs e Métricas: Discuta como definir indicadores de performance para medir a eficácia das estratégias de escalabilidade. Feedback e Iteração: A importância de coletar feedback e realizar ajustes contínuos no sistema para atender às necessidades dos usuários em evolução @jessilyneh

Slide 51

Slide 51 text

Escalabilidade no Backend Otimização de Banco de Dados: Técnicas para escalar bancos de dados, como sharding, replicação e uso de bancos NoSQL. Caching e Filas: Estratégias para reduzir a carga no backend, como caching em diferentes níveis e uso de filas assíncronas. Processamento Assíncrono: Aborde a importância de delegar tarefas demoradas para processos assíncronos, como workers e background jobs. @jessilyneh

Slide 52

Slide 52 text

Trade-offs na divisão de sistemas em microsserviços @jessilyneh

Slide 53

Slide 53 text

Trade-offs na divisão de sistemas em microsserviços Distribuição: Latência de chamadas remotas, overhead de rede e custos operacionais Chamadas em processos(in-process) e chamadas remotas(remote calls) @jessilyneh

Slide 54

Slide 54 text

Trade-offs na divisão de sistemas em microsserviços Consistência eventual: atualização assíncrona, uso técnicas de sincronização ou compensação para atingir estado consistente. Diversidade tecnológica: aplicações em tecnologias diversas, aumento de custo de manutenção. Segurança: Mais pontos de exploração para atacantes, gerenciamento de acessos, monitoramento e auditoria, atualizações constantes Orquestração: Interação coordenada para funcionalidades completas, transações distribuidas, gestão de configuração @jessilyneh

Slide 55

Slide 55 text

Escolhendo a granularidade adequada tamanho e complexidade de um sistema microsserviço deve: refletir uma unidade de negócios ou um domínio coeso ser capaz de evoluir independentemente dos outros ter fácil comunicação considerar requisitos de desempenho, como responsividade e processamento de dados https://architecturenotes.co/granularity-of-systems/ @jessilyneh

Slide 56

Slide 56 text

Estabelecendo fronteiras entre microserviços Boundaries Context (contexto delimitado): conceito fundamental no DDD, que ajuda a dividir e organizar modelos de domínio extensos Responsabilidades: Uma parte limitada da lógica de negócios. Limite de transações: Cuidado com casos de falhas, considere estratégias como consistência eventual Requisitos de desempenho e escalabilidade Contratos explícitos entre as APIs @jessilyneh

Slide 57

Slide 57 text

Comunicação Síncrona vs Assíncrona Síncrona: as chamadas criam uma cadeia de dependências por meio de todos os serviços Um serviço que faz uma chamada síncrona para um carrinho de compras também pode ficar dependente do pagamento associado e dos serviços de armazenamento. Se um ou mais desses serviços não estiverem disponíveis, é improvável que o chamador receba uma resposta. Mesmo que haja uma resposta, pode demorar tanto que o usuário encerrará a sessão @jessilyneh

Slide 58

Slide 58 text

Comunicação Síncrona Padrão de Requisição-Resposta Bloqueio de Recursos Simplicidade de Implementação Depuração Simples Latência de Rede Crítica: Em cenários onde a latência de rede é crítica, a comunicação síncrona pode ser preferível, pois a resposta é imediata. @jessilyneh

Slide 59

Slide 59 text

Comunicação Síncrona vs Assíncrona Assíncrona: Pode ser realizada por meio de mensagens assíncronas ou sondagem HTTP, aliada a uso de message brokers, como Kafka ou RabbitMQ. Cada microsserviço envia mensagens para o message broker e os outros microsserviços pegam as mensagens quando estiverem prontos @jessilyneh

Slide 60

Slide 60 text

Infraestrutura Escalável Provisionamento Automático, como Terraform e Ansible, para criar e gerenciar a infraestrutura de forma programática. Contêineres e Orquestração, para empacotar e escalar serviços de forma eficiente. Serverless e FaaS, como AWS Lambda podem simplificar a escalabilidade. @jessilyneh

Slide 61

Slide 61 text

Frontend escalável Desenvolvimento Modular, permite dividir a interface do usuário em componentes independentes e reutilizáveis, facilitando a manutenção e a escalabilidade. Micro Front-ends: onde diferentes equipes desenvolvam e implantem partes da aplicação de forma independente, aumentando a agilidade e a escalabilidade @jessilyneh

Slide 62

Slide 62 text

Frontend escalável Lazy Loading: Implementação de técnicas de carregamento sob demanda para recursos que não são imediatamente necessários, reduzindo o tempo de carregamento inicial e melhorando a experiência do usuário. Divisão de Código: Uso de técnicas de divisão de código para carregar apenas o que é necessário em cada parte da aplicação, minimizando o consumo de recursos e melhorando a performance @jessilyneh

Slide 63

Slide 63 text

Frontend escalável Gerenciamento Eficiente: Utilização de bibliotecas de gerenciamento de estado que suportem a escalabilidade, para lidar com o estado da aplicação de forma eficiente, especialmente em aplicações grandes. Experiência do Usuário: Criação de interfaces responsivas que se adaptam a diferentes tamanhos de tela e dispositivos, garantindo uma experiência consistente para todos os usuários, independentemente do dispositivo utilizado @jessilyneh

Slide 64

Slide 64 text

Segurança em Escala Práticas de Segurança, como autenticação robusta, autorização granular e proteção contra ataques comuns (OWASP Top 10). Monitoramento e Detecção de Ameaças, para identificar e mitigar riscos em sistemas escaláveis. @jessilyneh

Slide 65

Slide 65 text

Redes e Distribuição de Conteúdo CDNs e Otimização de Entrega, para entregar conteúdo estático de forma rápida e escalável. Diferentes estratégias de balanceamento de carga, como DNS round-robin, balanceadores de carga e roteamento baseado em conteúdo. Projetar sistemas tolerantes a falhas e implementar mecanismos de failover para garantir a disponibilidade em escala. @jessilyneh

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

O Papel das Decisões Arquiteturais - PRILER checklist Prioridade e Valor Reversibilidade Impacto (escopo/efeito) Limitações e Restrições Esforço (custo, recursos) Risco @jessilyneh

Slide 69

Slide 69 text

@jessilyneh https://speakerdeck.com/jessilyneh Todas as minhas palestras estão disponiveis aqui! Arquitetura, Java, Javascript, Performance e Observabilidade

Slide 70

Slide 70 text

@jessilyneh https://speakerdeck.com/jessilyneh Todas as minhas palestras estão disponiveis aqui! Arquitetura, Java, Javascript, Performance e Observabilidade

Slide 71

Slide 71 text

Referências https://www.architectureandgovernance.com/applications-technology/the-mindset-for- architectural-decisions/ M.A. Babar et al., Software Architecture Knowledge Management: Theory and Practice, Springer, 2009. https://www.infoq.com/articles/sustainable-architectural-design-decisions/ https://adr.github.io/ https://www.koziolek.de/docs/Koziolek2013-IEEE-SW-preprint.pdf https://github.com/joelparkerhenderson/decision-record https://martinfowler.com/bliki/ConwaysLaw.html @jessilyneh

Slide 72

Slide 72 text

Referências https://martinfowler.com/articles/microservice-trade-offs.html https://martinfowler.com/articles/distributed-objects-microservices.html https://www.researchgate.net/publication/334305107_mvIMS_A_Finer- Scalable_Architecture_Based_on_Microservices https://architecturenotes.co/granularity-of-systems/ QuQuando é o momento de migrar do monólito para microservices? Elder Moraes: https://youtu.be/on1wVvLT1ec?si=b6jhnHdh2IGXZG1e https://www.melconway.com/Home/Committees_Paper.html https://intellyx.com/2015/06/22/devops-insights-into-conways-law/ @jessilyneh

Slide 73

Slide 73 text

Referências https://kishoreconnect.com/understanding-processes-threads-and-cpu-cores https://www.allaboutcircuits.com/technical-articles/what-is-virtual-memory/ @jessilyneh