Pular para o conteúdo

Conceitos

CAP theorem trade-offs

Intuição

Imagine duas filiais de um banco em cidades diferentes, cada uma com sua própria cópia do saldo dos clientes, ligadas por um cabo de telefone que às vezes cai. Enquanto o cabo funciona, as duas filiais conseguem se avisar de qualquer depósito e ficar sempre de acordo. Mas se o cabo cair bem na hora em que um cliente deposita dinheiro numa filial e outro cliente pergunta o saldo na outra, a filial que recebeu a pergunta tem só duas opções: responder com o número antigo (que pode estar errado) ou dizer 'não sei, espera o cabo voltar' (deixando o cliente sem resposta). Ela não pode fazer as duas coisas ao mesmo tempo, e é exatamente essa escolha forçada, no momento em que a comunicação falha, que o CAP theorem descreve.

Como funciona

Gilbert e Lynch formalizam as três propriedades num modelo assíncrono: Consistência exige que toda leitura, após uma escrita concluída, retorne aquele valor ou um mais recente, como se existisse uma única cópia lógica dos dados; Disponibilidade exige que todo pedido a um nó não-falho eventualmente receba resposta; Tolerância a partição significa que o sistema continua operando mesmo quando mensagens entre subconjuntos de nós são perdidas ou arbitrariamente atrasadas, sem que ninguém saiba se a mensagem sumiu ou só está lenta. A prova usa dois nós replicando o mesmo dado, separados por uma partição: um cliente escreve no primeiro nó, que responde (disponibilidade) sem conseguir propagar a atualização; outro cliente lê no segundo nó, que também é obrigado a responder (disponibilidade) mas só tem o valor antigo — quebrando a consistência. O ponto central não é que 'você escolhe 2 de 3 para sempre', mas que essa escolha só é forçada no instante em que uma partição de fato acontece: cada nó isolado precisa decidir, ali, entre responder com dado possivelmente desatualizado ou recusar a resposta até ter certeza. Fora de uma partição em curso, nada impede o sistema de ser consistente e disponível simultaneamente — e num modelo parcialmente síncrono com timeouts, o sistema ainda enfrenta o mesmo teorema, mas pode gerenciar o trade-off de forma mais informada, tolerando inconsistência só pelo tempo estimado da partição.

Na prática

Bancos de dados distribuídos declaram explicitamente seu lado do trade-off só para o caso de partição: sistemas como o DynamoDB clássico ou Cassandra escolhem disponibilidade (AP) e aceitam leituras potencialmente desatualizadas, enquanto sistemas com consenso forte como bancos relacionais com replicação síncrona escolhem consistência (CP) e recusam respostas quando não conseguem confirmar quórum. A extensão PACELC (Abadi) lembra que mesmo sem partição alguma, o mesmo sistema ainda escolhe entre latência e consistência — por isso arquitetos avaliam CAP como uma decisão sobre o comportamento durante falhas de rede, não como um rótulo permanente do sistema inteiro.

Use em um desenho

Pratique na escola de System Design os casos que dependem deste conceito.