Untitled Flashcards Set

Arquitetura vs Design

Obs: existem pontos de vista diferentes

Arquitetura: escopo global (restrições de alto nível, atributos de qualidade)

Design: escopo local (como implementar os componentes)

→ Sempre que se fala de arquitetura também se fala de design, mas nem sempre que se fala de design se fala de arquitetura

Sustentabilidade

  • Software precisa acompanhar a evolução do negócio.

  • Quanto mais tempo o software ficar no ar, mais retorno gera.

Pilares da Arquitetura de Software

  • Estruturação

    • Fácil evolução, como componentizar os objetivos de negócio

  • Componentização

  • Relacionamento entre sistemas

  • Governança: documentação, regras, definições, não necessitar de uma pessoa

Requisitos Arquiteturais (RAs)

→ Com os modelos de squad, os requisitos ficaram mais flexíveis e implícitos

Define as regras de desenvolvimento

  • Tipos de Requisitos

    • Performance

    • Armazenamento de dados

    • Escalabilidade (horizontal, vertical, load balancer)

    • Segurança

    • Auditoria (eg. logar acessos e operações)

    • Marketing (eg. tracking de dados)

Características Arquiteturais

Checklist de características para se pensar quando for desenvolver software:

  • Características Operacionais

    • Disponibilidade

    • Recuperação de desastres

    • Performance

    • Recuperação (backup)

    • Confiabilidade e segurança

    • Robustês (consegue escalar se necessário)

    • Escalabilidade

  • Características Estruturais

    • Configurável (trocar chaves, senhas, etc)

      • Deve ser fácil mudar de ambiente (dev → sandbox → prod)

    • Extensibilidade

      • Deve ser pensado para crescer

      • Deve ser fácil adicionar vendors (message brokers, banco de dados, api, etc) e lógica (Open/Close do SOLID)

    • Fácil instalação

      • Padronização de ambiente (containers)

      • Configurável

      • Se preocupar com dependências (elastic search, tópicos do kafka, etc)

    • Reuso de componentes

    • Internacionalização

      • Front-End: layout, cultura

      • Back-End: moeda, políticas de pagamento

    • Fácil manutenção

      • Usar testes

    • Portabilidade

      • Diminuir a dependência de vendors

    • Fácil suporte (logs, debugging)

  • Características Cross-Cutting

    • Acessibilidade

    • Processo de rentenção e recuperação de dados

      • Tempo que os dados serão mantidos

    • Autenticação e Autorização

    • Partes Legais

    • Privacidade (LGPD)

    • Segurança

    • Usabilidade (back e front)

Perspectiva de Performance

Performance é o desempenho que um software possui para completar um determinado workload

→ Ter um software escalável é diferente de ter um software performático

  • Métricas para medir performance

    • Latência ou “response time”

      • Normalmente medida em milliseconds

      • Afetada pelo processamento da aplicação, rede e chamadas externas

    • Throughput

      • Quanto de requisição o software consegue aguentar

      • Ligado a latência

  • Razões para baixa performance

    • Processamento ineficiente

      • Lógica por trás do software (algoritmos, queries, frameworks)

      • Uso de um banco de dados correto

    • Recursos computacionais limitados (vertical, horizontal)

      • Escala da capacidade computacional (CPU, Disco, Memória) - vertical

      • Caching

        • → Pode ser exclusivo (local) ou compartilhado (centralizado)

        • Cache na borda / Edge computing (CloudFlare / Akamai)

          • Mais próximo ao usuário

          • Evita requisição chegar até o Cloud Provider

          • Arquivos estáticos / CDN (Content Delivery Network)

          • Origin (provider) → Midwest (espalhamento) → Edge (usuário)

        • Dados estáticos

        • Páginas web

        • Funções internas

          • Algoritmos pesados

          • Acesso ao db

        • Objetos

    • Trabalhar de forma bloqueante / Acesso serial a recursos (locks, sync)

      • Concorrência e paralelismo

        • Concorrência é sobre lidar com muitas coisas ao mesmo tempo. Paralelismo é fazer muitas coisas ao mesmo tempo (Rob Pyke - um dos criadores do Go)

    Perspectiva de Escalabilidade

    Escalabilidade é a capacidade de sistemas suportarem o aumento (ou a redução) dos workloads incrementando (ou reduzindo) o custo em menor ou igual proporção

    Escalabilidade vs Performance

    Enquanto performance tem o foco em reduzir a latência e aumentar o throughput, a escalabilidade visa termos a possibilidade de aumentar ou diminuir o throughput adicionando ou removendo a capacidade computacional

  • Descentralização

    • → Uma máquina específica pode ser destruída ou criada a qualquer momento

    • Disco efêmero (eg. usar bucket s3 ao invés do disco da máquina)

    • Servidor de aplicação vs Servidor de assets (eg. bucket s3)

    • Cache centralizado (compartilhado)

    • Sessões (estado) centralizadas em um servidor (db)

  • Escalando banco de dados

    • Aumentar recurso compuacional

    • Dividir banco para escrita e leitura

    • Shards horizontais para leitura

    • Shard por particionamento

    • Otimizar queries

      • APM (Application Performance Monitor)

      • Explain

      • Indexar

      • CQRS (Command Query Responsibility Segregation)

  • Proxy reverso (Procurador)

    • É diferente de load balancer

    • Pode levar para servers com apps diferentes

    • Exemplos:

      • Nginx

      • HAProxy (HA = High Avaibility)

      • Traefik

      • Kong, API Gateway (baseado no Nginx)

Perspectiva de Resiliência

Resiliência é um conjunto de estratégias adotadas intencionalmente para a adaptação de um sistema quando uma falha ocorre.

Proteger e ser protegido

  • Um sistema não pode ser egoísta ao ponto de realizar mais requisições em um sistema que está falhando

  • Um sistema lento pode ser pior que um fora do ar (efeito dominó A → B → C = C lento gera A lento)

Health check

  • Um sistema que não está saudável possui chance de se recuperar caso o tráfego pare de ser direcionado a ele temporariamente (self healing)

  • Verificar diferentes componentes para gerar o health check (não apenas retornar 200 caso esteja on)

Rate Limiting

  • Saber quanto de carga um sistema pode suportar (orçamento, teste de stress, quantidade de máquinas)

  • Limitar requisições baseado no nível de criticidade do cliente

Circuit breaker

  • Protege o sistema fazendo com que as requisições sejam negadas

  • Objetivo é impedir efeito dominó e aplicar self healing

  • Circuito aberto = requisições não chegam no sistema

  • Circuito meio aberto = Permite uma quantidade limitada para verificar saúde

  • Circuito fechado = requisição chegam no sistema normalmente

  • Service mesh já implementa circuit breaker

API Gateway

  • “Portaria das APIs" - Ex. usuário não autenticado

  • Implementa políticas de Rate Limiting, Health Check, etc

Service Mesh

  • Controla o tráfego de rede

  • Evita implementações de proteção pelo próprio sistema (retry, rate limiting, circuit breaker, etc)

  • mTLS - Criptografa comunicação entre serviços evitando “man in the middle”

Trabalhar de forma assíncrona

  • Aguardar na fila

  • Evita perda de dados

  • Message broker / sistema de stream (fila)

Retry

  • Exponential backoff (esperar de forma exponencial)

  • Exponential backoff - Jitter (adicionar ruído a cada tentativa)

Garantias de entrega: Kafka

  • Ack 0 → sem confirmação de recebimento

  • Ack 1 → confirmação de recebimento pelo líder

  • Ack -1 → confirmação de recebimento por todas (líder e seguidores)

→ Cada ponto percentual adicionado de resiliência aumenta o custo