Software · Infraestrutura & Sistemas
Teorema CAP e Sistemas Distribuídos: O Dilema Inevitável entre Consistência e Disponibilidade
Entenda por que redes distribuídas nunca conseguem garantir consistência e disponibilidade simultâneas durante falhas e como avaliar os compromissos CP e AP.
No projeto de sistemas distribuídos e bancos de dados modernos, existe um limite matemático inegociável que dita como as informações podem ser replicadas e servidas através de múltiplos servidores. Formulado por Eric Brewer em 1999 e formalmente provado por Seth Gilbert e Nancy Lynch em 2002, o Teorema CAP (também conhecido como Teorema de Brewer) estabelece que é impossível para qualquer armazenamento distribuído garantir simultaneamente as três propriedades fundamentais de dados: Consistência, Disponibilidade e Tolerância a Partições.
Compreender esse teorema afasta discussões ingênuas sobre tecnologias "perfeitas" e orienta os arquitetos de software a tomarem decisões explícitas de engenharia baseadas nos riscos reais do negócio.
As Três Propriedades do Teorema
flowchart TB
C["CONSISTÊNCIA — C<br/>todos os nós leem o dado mais recente"]
A["DISPONIBILIDADE — A<br/>toda requisição recebe resposta"]
P["TOLERÂNCIA A PARTIÇÕES — P<br/>o sistema opera durante falhas de rede"]
C ---|CP| P
P ---|AP| A
A ---|CA| C
Tradeoff["Em uma partição de rede,<br/>escolha consistência ou disponibilidade"]
Tradeoff -.-> C
Tradeoff -.-> A
classDef property fill:#172033,stroke:#38bdf8,color:#f8fafc;
classDef decision fill:#2a1f32,stroke:#a855f7,color:#f8fafc;
class C,A,P property;
class Tradeoff decision;
1. Consistência (Consistency - C)
No contexto do Teorema CAP, consistência refere-se à linearizabilidade: todo nó do cluster deve retornar o dado mais recentemente gravado no exato instante em que uma leitura for realizada. Para o cliente da aplicação, o sistema comporta-se como se existisse apenas uma única cópia atômica da informação, mesmo que ela esteja fisicamente distribuída em cinco data centers pelo mundo.
2. Disponibilidade (Availability - A)
Toda requisição não-bloqueada enviada por um cliente a um nó saudável do cluster deve receber uma resposta válida (de sucesso ou falha planejada de negócio), sem travar a conexão em esperas infinitas ou erros de tempo esgotado (timeout). A resposta deve ser imediata, ainda que os dados retornados não representem necessariamente a versão mais recente.
3. Tolerância a Partições de Rede (Partition Tolerance - P)
O sistema tem capacidade de continuar operando normalmente mesmo quando conexões de rede entre os servidores são rompidas, perdidas ou sofrem atrasos severos, dividindo o cluster em duas ou mais metades isoladas (Network Partition).
Por que a Tolerância a Partições é Inegociável
Existe uma interpretação equivocada comum de que um arquiteto pode "escolher duas das três garantias" como em um cardápio de restaurante (por exemplo, optar por "CA" — Consistência e Disponibilidade).
Em qualquer sistema distribuído real, cabos de rede sofrem rompimentos, switches quebram, zonas de nuvem oscilam e a latência de comunicação varia de maneira imprevisível. Portanto, a tolerância a partições (P) não é uma opção; ela é uma condição compulsória da física das redes.
Quando uma partição de rede inevitavelmente acontece entre o Data Center de São Paulo e o de Nova York, o arquiteto é forçado a escolher entre dois únicos caminhos:
Cenário 1: Escolher Consistência sobre Disponibilidade (Sistemas CP)
Se o sistema prioriza a integridade absoluta da informação a qualquer custo, o nó de São Paulo recusa-se a aceitar novas gravações ou leituras enquanto não conseguir sincronizar com o nó de Nova York.
- Consequência: O cliente recebe uma mensagem de erro ou bloqueio temporário, mas o sistema garante que nenhum saldo bancário incorreto ou venda em duplicidade seja gravado.
- Exemplos de Tecnologias: MongoDB (com escrita majoritária configurada), Apache HBase, CockroachDB e Redis Cluster.
Cenário 2: Escolher Disponibilidade sobre Consistência (Sistemas AP)
Se o sistema prioriza manter o serviço online para os usuários mesmo durante a pane de rede, os nós de São Paulo e Nova York continuam respondendo a requisições de forma autônoma.
- Consequência: O cliente em São Paulo pode ler uma versão ligeiramente defasada da informação até que a partição de rede seja resolvida e os nós sincronizem suas divergências via consistência eventual (Eventual Consistency).
- Exemplos de Tecnologias: Apache Cassandra, Amazon DynamoDB e CouchDB.
E onde ficam os Bancos de Dados Tradicionais (CA)?
Sistemas classificados teoricamente como "CA" (Consistentes e Disponíveis) só conseguem fornecer essa garantia porque não toleram falhas de rede — o que significa que não são sistemas verdadeiramente distribuídos.
Bancos relacionais clássicos (como uma instância única de PostgreSQL ou MySQL rodando em um único servidor físico) operam com transações ACID completas e disponibilidade garantida para suas conexões locais. No entanto, no momento em que você introduz réplicas de leitura em outras máquinas ou fragmentação (sharding), a rede torna-se uma variável crítica e o banco é instantaneamente jogado no dilema do Teorema CAP.
| Classificação | Prioridade Real | Comportamento sob Falha de Rede | Cenário de Negócio Ideal |
|---|---|---|---|
| CP | Consistência | Rejeita requisições para evitar dados divergentes. | Saldo financeiro, emissão fiscal, reservas de voos. |
| AP | Disponibilidade | Responde com o dado localmente disponível. | Feeds de redes sociais, catálogos de produtos, métricas de telemetria. |
| CA (Nó Único) | Transacional Local | Não se aplica (não opera em múltiplos nós de rede). | Aplicações tradicionais centralizadas em um único servidor. |
Compreender o Teorema CAP permite que a equipe de engenharia selecione o banco de dados e o modelo de persistência adequados para cada domínio de negócio, abandonando soluções genéricas e construindo aplicações preparadas para sobreviver aos imprevistos inevitáveis da infraestrutura moderna.