Design e Arquitetura de Sistemas
Explique a diferença entre arquiteturas Monolíticas e de Microsserviços. Quais são os prós e contras de cada uma?
Resposta:
A arquitetura monolítica é uma aplicação única e rigidamente acoplada. Prós: mais simples de desenvolver e implantar inicialmente. Contras: difícil de escalar, manter e atualizar. A arquitetura de microsserviços é uma coleção de serviços pequenos e fracamente acoplados. Prós: implantação independente, escalabilidade e diversidade tecnológica. Contras: aumento da complexidade no desenvolvimento, implantação e monitoramento.
O que é o teorema CAP e como ele se relaciona com o design de sistemas distribuídos?
Resposta:
O teorema CAP afirma que um armazenamento de dados distribuído só pode garantir duas das três propriedades: Consistência, Disponibilidade e Tolerância a Partições. Em um sistema distribuído, você deve escolher quais duas propriedades priorizar quando ocorre uma partição de rede. A maioria dos sistemas distribuídos modernos prioriza Disponibilidade e Tolerância a Partições (AP) em detrimento da Consistência forte (CP).
Descreva diferentes tipos de algoritmos de balanceamento de carga e seus casos de uso.
Resposta:
Algoritmos comuns de balanceamento de carga incluem Round Robin (distribui requisições sequencialmente), Menos Conexões (envia para o servidor com menos conexões ativas) e IP Hash (distribui com base no IP do cliente). Round Robin é simples para cargas uniformes. Menos Conexões é bom para tempos de processamento de requisições variáveis. IP Hash garante "session stickiness" (manter a sessão no mesmo servidor) sem gerenciamento explícito de sessão.
O que é consistência eventual e onde ela é comumente usada?
Resposta:
Consistência eventual é um modelo de consistência onde, se nenhuma nova atualização for feita em um determinado item de dados, eventualmente todos os acessos a esse item retornarão o último valor atualizado. É comumente usada em sistemas distribuídos altamente disponíveis, como bancos de dados NoSQL (por exemplo, Cassandra, DynamoDB) e DNS, onde a consistência imediata não é crítica e a disponibilidade é priorizada.
Explique o conceito de Escalabilidade Horizontal vs. Vertical.
Resposta:
Escalabilidade vertical (scale up) significa adicionar mais recursos (CPU, RAM) a um servidor existente. É mais simples, mas tem limites. Escalabilidade horizontal (scale out) significa adicionar mais servidores para distribuir a carga. Oferece maior escalabilidade e tolerância a falhas, mas adiciona complexidade no gerenciamento de sistemas distribuídos.
O que são filas de mensagens e por que são usadas no design de sistemas?
Resposta:
Filas de mensagens (por exemplo, Kafka, RabbitMQ) permitem comunicação assíncrona entre diferentes partes de um sistema. Elas desacoplam serviços, bufferizam requisições durante picos de carga, melhoram a tolerância a falhas ao tentar novamente operações falhas e facilitam arquiteturas orientadas a eventos. Isso melhora a escalabilidade e a confiabilidade.
Como você lida com sharding/particionamento de banco de dados? Quais são seus benefícios e desafios?
Resposta:
O sharding de banco de dados envolve a divisão de um banco de dados grande em partes menores e mais gerenciáveis (shards) em múltiplos servidores. Os benefícios incluem melhor escalabilidade, desempenho e isolamento de falhas. Os desafios incluem aumento da complexidade na distribuição de dados, roteamento de consultas, joins entre shards e rebalanceamento.
O que é uma CDN (Content Delivery Network) e como ela melhora o desempenho do sistema?
Resposta:
Uma CDN é uma rede geograficamente distribuída de servidores proxy e data centers. Ela melhora o desempenho do sistema ao armazenar em cache conteúdo estático (imagens, vídeos, CSS, JS) mais perto do usuário final, reduzindo a latência e descarregando o tráfego do servidor de origem. Isso resulta em entrega de conteúdo mais rápida e melhor experiência do usuário.
Discuta a importância da idempotência no design de APIs para sistemas distribuídos.
Resposta:
Idempotência significa que uma operação pode ser aplicada várias vezes sem alterar o resultado além da aplicação inicial. Em sistemas distribuídos, onde problemas de rede ou retentativas são comuns, APIs idempotentes evitam efeitos colaterais indesejados (por exemplo, pagamentos duplicados) se uma requisição for enviada várias vezes. Métodos HTTP como GET, PUT e DELETE são inerentemente idempotentes.
O que é o padrão circuit breaker e quando você o usaria?
Resposta:
O padrão circuit breaker impede que um sistema tente repetidamente executar uma operação que provavelmente falhará, economizando assim recursos e prevenindo falhas em cascata. Ele monitora chamadas a um serviço; se as falhas excederem um limite, ele 'dispara' (abre), impedindo chamadas adicionais por um período. É usado ao integrar com serviços externos ou não confiáveis.
Explique o conceito de caching no design de sistemas. Quais são as diferentes estratégias de caching?
Resposta:
Caching armazena dados acessados com frequência em um armazenamento temporário mais rápido para reduzir a latência e a carga do banco de dados. As estratégias incluem: Write-Through (escreve no cache e no DB simultaneamente), Write-Back (escreve no cache, depois assincronamente no DB) e Cache-Aside (a aplicação gerencia leituras/escritas no cache, verificando o cache primeiro). Políticas de evicção como LRU (Least Recently Used - Menos Usado Recentemente) também são cruciais.