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