Quiz
Clique em "Resposta" para revelar a resposta correta e a explicação. Tente responder antes de revelar.
Fundamentos
Q1. O serviço de pedidos chama o serviço de produtos para reservar uma unidade do estoque e não recebe resposta dentro do seu timeout de 2 segundos. O que ele pode concluir com segurança?
- A. O serviço de produtos caiu e precisa ser reiniciado
- B. A reserva não foi aplicada, então é seguro fazer um retry sem nenhuma precaução
- C. Nada com certeza — a requisição pode ter se perdido, ter sido aplicada com a resposta perdida ou ainda estar em andamento; um retry precisa ser idempotente
- D. A rede está particionada, então o serviço de pedidos precisa mudar para o modo CP
Resposta
C — Nada com certeza; os retries precisam ser idempotentes.
Uma requisição perdida, um servidor que caiu, uma resposta perdida e um servidor muito lento parecem iguais para quem chama: silêncio. O timeout só diz "parei de esperar". Se a reserva de fato foi aplicada e a resposta se perdeu, um retry ingênuo reserva a unidade duas vezes. Tornar a operação idempotente (por exemplo, com um id único de requisição que o servidor usa para descartar duplicatas) torna o retry seguro.
Q2. Usando relógios de Lamport, o processo B tem o contador em 3 e recebe uma mensagem com o carimbo 7. Qual é o contador de B depois do evento de recebimento?
- A. 3
- B. 4
- C. 7
- D. 8
Resposta
D — 8.
No recebimento, a regra é max(local, received) + 1 = max(3, 7) + 1 = 8. Isso garante que o evento de recebimento tenha um timestamp maior do que o evento de envio, de modo que a relação "aconteceu-antes" sempre se reflete nos timestamps. Note que a recíproca não vale: um timestamp de Lamport menor não prova causalidade — para isso são necessários relógios vetoriais.
Teorema CAP
Q3. O que significa o P do CAP, e por que ele é inegociável em qualquer sistema distribuído real?
- A. Performance (desempenho) — sistemas lentos são considerados indisponíveis
- B. Persistence (persistência) — os dados precisam sobreviver a reinícios dos nós
- C. Partition Tolerance (tolerância a partições) — o sistema continua operando apesar de partições de rede
- D. Predictability (previsibilidade) — as respostas precisam chegar dentro de um tempo limitado
Resposta
C — Partition Tolerance (tolerância a partições).
Partições de rede — em que as mensagens entre os nós são perdidas ou atrasadas — acontecem em qualquer sistema distribuído real, por falhas de hardware, congestionamento ou distância física. Como as partições não podem ser evitadas, a escolha prática de projeto é entre C (recusar requisições durante a partição) e A (continuar atendendo, possivelmente com dados desatualizados).
Q4. Um banco de dados distribuído recusa todas as leituras durante uma partição de rede para evitar devolver dados desatualizados. A qual categoria do CAP ele pertence?
- A. CA — Consistente e disponível
- B. CP — Consistente e tolerante a partições
- C. AP — Disponível e tolerante a partições
- D. Nenhuma — ele viola as três propriedades ao mesmo tempo
Resposta
B — CP.
Ao recusar leituras durante uma partição, o sistema prioriza a consistência (nada de dados desatualizados) em detrimento da disponibilidade. Quando a partição se resolve, o serviço é retomado. ZooKeeper e etcd são exemplos clássicos de CP.
Q5. Quais dos sistemas a seguir costumam ser classificados como AP (disponíveis e tolerantes a partições)?
- A. Apache ZooKeeper e etcd
- B. PostgreSQL e MongoDB
- C. Apache Cassandra e DNS
- D. Redis e SQLite
Resposta
C — Apache Cassandra e DNS.
Ambos continuam atendendo requisições durante partições, aceitando que as respostas possam estar temporariamente desatualizadas (consistência eventual). ZooKeeper e etcd são CP; o PostgreSQL com replicação síncrona e o MongoDB com as escritas por maioria padrão se comportam como CP. Um Redis ou SQLite de um único nó nem sequer é replicado, então o CAP não se aplica de verdade a ele — ele fica no canto "CA" apenas porque não há um segundo nó do qual ficar particionado.
Q6. O teorema PACELC estende o CAP. Do que trata a parte ELC, que o CAP ignora?
- A. Mesmo depois que uma partição se resolve, o sistema precisa reeleger um líder antes de atender
- B. Mesmo sem partição, o sistema precisa escolher entre latência e consistência
- C. Toda conexão perdida exige um checkpoint antes que a operação normal seja retomada
- D. A consistência eventual é sempre preferível à consistência forte sob carga baixa
Resposta
B — Mesmo sem partição: trade-off entre latência e consistência.
O CAP só descreve o comportamento durante uma partição. O PACELC acrescenta que, mesmo na operação normal, os sistemas precisam escolher entre latência menor (atender rápido, arriscando leituras levemente desatualizadas) e consistência mais forte (esperar o acordo da replicação antes de responder). O Cassandra é PA/EL; o MongoDB com escritas por maioria é PC/EC.
Q7. Um serviço de pagamentos nunca pode permitir uma cobrança em dobro. Ocorre uma partição de rede entre o nó de pagamentos e o nó de replicação. Qual projeto é o correto?
- A. Usar um armazenamento AP — a disponibilidade garante que o pagamento sempre seja processado
- B. Usar um armazenamento CA — a garantia de nó único evita problemas de concorrência
- C. Usar um armazenamento CP — recusar a requisição durante a partição em vez de arriscar um estado inconsistente
- D. Usar um armazenamento AP com last-write-wins — os timestamps evitam duplicatas
Resposta
C — Armazenamento CP.
Em transações financeiras, a correção é inegociável. Um armazenamento CP se recusa a processar o pagamento durante a partição (o cliente recebe um erro, e não uma cobrança em dobro). Um armazenamento AP poderia processar o pagamento em dois nós simultaneamente antes de a partição se resolver, criando uma transação duplicada que não pode ser desfeita com segurança. O last-write-wins (D) descartaria silenciosamente uma das escritas conflitantes, e depende de relógios que derivam.
Q8. Em que cenário um sistema CA (consistente e disponível) é de fato possível?
- A. Em um cluster de três nós com replicação síncrona
- B. Em um sistema geograficamente distribuído com enlaces dedicados
- C. Apenas em um sistema de uma única máquina ou em uma rede local rigidamente controlada, sem possibilidade de partições
- D. Nunca — CA é teoricamente impossível
Resposta
C — Uma única máquina ou uma rede local rigidamente controlada.
CA só funciona quando partições realmente não podem ocorrer — o que só é realista para um único servidor ou para uma rede local sob controle rigoroso. Em qualquer implantação conectada à internet ou geograficamente distribuída, P é, na prática, obrigatório, e a escolha real fica entre C e A.
Q9. Em termos de PACELC, como você classificaria um sistema que favorece baixa latência durante a operação normal e disponibilidade durante uma partição?
- A. PC/EC
- B. PA/EC
- C. PC/EL
- D. PA/EL
Resposta
D — PA/EL.
PA = durante uma partição (Partition), favorece a disponibilidade (Availability). EL = caso contrário (Else, operação normal), favorece a latência (Latency). O Apache Cassandra é o sistema PA/EL canônico — ele sempre responde rápido e aceita a consistência eventual nos dois cenários.
Algoritmos de consenso
Q10. O que o Teorema da Impossibilidade FLP prova sobre o consenso distribuído?
- A. O consenso é impossível em qualquer sistema com mais de um nó
- B. Em um sistema puramente assíncrono, em que até mesmo um processo pode cair, nenhum algoritmo determinístico consegue garantir que o consenso seja sempre alcançado
- C. A eleição de líder sempre termina em um número fixo de rodadas
- D. Falhas bizantinas tornam o consenso impossível mesmo com redes síncronas
Resposta
B — Não há garantia de término em um sistema assíncrono com ≥1 nó defeituoso.
O FLP (Fischer, Lynch, Paterson, 1985) prova esse limite fundamental: alguma ordenação azarada de atrasos pode manter qualquer algoritmo determinístico indeciso para sempre. Os algoritmos reais respondem a isso assumindo sincronia parcial (os atrasos acabam ficando limitados) ou usando aleatorização. Paxos e Raft nunca violam a safety e usam timeouts como substituto da detecção de falhas para progredir.
Q11. No Raft, que evento dispara uma nova eleição de líder?
- A. O líder atual envia uma mensagem
resignao cluster - B. Uma maioria dos followers vota pela remoção do líder atual
- C. O timeout de eleição de um follower expira sem que ele receba um heartbeat do líder atual
- D. O cluster detecta que o log do líder divergiu dos logs dos followers
Resposta
C — O timeout de eleição de um follower expira.
Cada follower mantém um timeout de eleição aleatório. Se nenhum heartbeat chega antes de ele expirar, o follower assume que o líder caiu e inicia uma nova eleição, incrementando o term e pedindo votos. Os timeouts aleatórios evitam que vários followers iniciem eleições ao mesmo tempo.
Q12. Uma equipe roda o etcd em 4 nós "para ficar mais seguro do que com 3". Quantas falhas de nós o cluster de 4 nós tolera e ainda continua aceitando escritas?
- A. 1 — o mesmo que um cluster de 3 nós
- B. 2 — metade dos nós
- C. 3 — qualquer nó sobrevivente pode atender escritas
- D. 0 — um número par de nós não consegue eleger um líder
Resposta
A — 1.
Uma escrita precisa de uma maioria: ⌊4/2⌋ + 1 = 3 nós. Com 2 nós fora do ar, restam apenas 2, o que não é maioria. Portanto, 4 nós toleram ⌊(4-1)/2⌋ = 1 falha — o mesmo que 3 nós, com uma máquina a mais que pode falhar. É por isso que clusters de consenso usam tamanhos ímpares (3 ou 5). Um cluster par ainda consegue eleger um líder (D é falsa); ele só não ganha nada com isso.
Q13. Qual fórmula garante que todo quórum de leitura se sobreponha a todo quórum de escrita, assegurando que você sempre leia a escrita mais recente?
- A. W > N / 2
- B. R > N / 2
- C. W = R = N
- D. W + R > N
Resposta
D — W + R > N.
Se o quórum de escrita W somado ao quórum de leitura R ultrapassa o total de réplicas N, pelo menos um nó que confirmou a escrita precisa participar de qualquer quórum de leitura. Essa sobreposição garante que a escrita mais recente esteja sempre visível em uma leitura por quórum, e é a base de sistemas como o Dynamo e da consistência ajustável do Cassandra (por exemplo, leituras e escritas QUORUM com N = 3: 2 + 2 > 3).
Q14. Duas réplicas de um CRDT G-Counter contêm [4, 1, 0] e [2, 3, 0] (uma posição por nó). Qual é o valor do contador depois que elas fazem o merge?
- A. 5 — o maior dos dois totais
- B. 7 — o máximo elemento a elemento,
[4, 3, 0], somado - C. 10 — a soma dos dois totais
- D. Depende de qual réplica fez o merge por último
Resposta
B — 7.
O merge do G-Counter toma o máximo elemento a elemento das posições: [max(4,2), max(1,3), max(0,0)] = [4, 3, 0], cuja soma é 7. Como cada nó só incrementa a sua própria posição, o máximo de uma posição é o seu valor mais recente; somar os dois totais (C) contaria em dobro, e o merge é comutativo e idempotente, então a ordem dos merges não importa (D é falsa).