Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Estrategias de escalabilidade para projetos web

Jessilyneh
September 06, 2024

Estrategias de escalabilidade para projetos web

Jessilyneh

September 06, 2024
Tweet

More Decks by Jessilyneh

Other Decks in Technology

Transcript

  1. 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
  2. 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
  3. the scale cube Este cubo é descrito no livro de

    Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). @jessilyneh
  4. 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
  5. the scale cube Este cubo é descrito no livro de

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

    Martin Abbott e Michael Fisher, The Art of Scalability (Addison- Wesley, 2015). @jessilyneh
  7. Escala vertical e escala horizontal Adicione mais máquinas ou nós

    Adicione mais poder aos recursos existentes @jessilyneh
  8. 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
  9. 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
  10. “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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. Estratégias de Implementação para Escalabilidade (Com ressalvas) Adoção de Arquiteturas

    de Microsserviços Utilização de serviços de Cloud @jessilyneh
  28. 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
  29. 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
  30. 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/
  31. 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/
  32. 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)
  33. 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/
  34. 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)
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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