詳細検索

O que você precisa saber sobre o Teorema da CAP

Avatar
por Chen Ziyu
5 min de leitura

O que você precisa saber sobre o Teorema da CAP
Traduzido do English • Ver original

O mundo em que vivemos está longe de ser perfeito. Constantemente nos encontramos em dilemas, às vezes até trilemas, que nos exigem fazer concessões. Ao fazer compras, só podemos escolher dois entre "barato", "rápido" e "bom". Em economia, um governo não pode desfrutar de "política monetária soberana", "taxa de câmbio fixa" e "fluxo livre de capital" ao mesmo tempo. Ele só pode alcançar dois deles abrindo mão do terceiro. Da mesma forma, o teorema da PAC (consistência, disponibilidade e tolerância a partições) envolve um trilema igualmente intrigante que tem preocupado cientistas da computação e engenheiros de software desde que a computação distribuída se tornou uma solução popular para a computação em larga escala. Hoje, vamos mergulhar profundamente no teorema da PAC e aprender a fazer trade-offs sábios com base em nossas necessidades.

PACELC-theorem-diagram

O Teorema da CAP

Primeiro, vamos começar com o trilema enunciado no teorema da CAP. CAP significa consistência, disponibilidade e tolerância à partição. O teorema da CAP afirma que um sistema distribuído só pode garantir duas dessas três características diante da partição da rede. Em seguida, definirei consistência, disponibilidade e tolerância de partições no contexto do teorema da CAP.

Consistência

Se um sistema distribuído for consistente, toda requisição de leitura recebe a gravação mais recente ou um erro. Em outras palavras, com consistência, não importa para qual nó os usuários façam uma requisição de leitura, eles sempre recebem os dados mais recentes escritos no sistema distribuído ou um erro se os dados mais recentes não estiverem disponíveis no momento.

Disponibilidade

Disponibilidade significa que toda solicitação recebe uma resposta que não seja erro e que não necessariamente contém a escrita mais recente. Em outras palavras, com disponibilidade, os usuários sempre recebem os dados que solicitam, mas os dados podem estar desatualizados.

Tolerância de Partição

Um sistema distribuído que tolera particionamento continua operando apesar de um número arbitrário de mensagens sendo descartadas ou atrasadas pela rede entre nós. Em outras palavras, com tolerância de partição, o sistema permanece operacional mesmo quando alguns de seus nós não conseguem enviar mensagens entre si.

Alguns de vocês podem perguntar: por que os três não podem ser alcançados ao mesmo tempo quando ocorre a partição da rede? Embora você possa encontrar uma prova de conceito bem articulada publicada por Seth Gilbert e Nancy Lynch, pode ser um pouco complicado e desnecessário para não cientistas da computação entenderem. Portanto, apresentarei uma demonstração mais curta com um exemplo simples.

distributed system

Vamos fazer as seguintes suposições: 1. Temos um sistema distribuído composto por dois nós independentes: Nó A e Nó B. 2. Devido a falhas na rede, esses dois nós não podem receber mensagens um do outro, ou seja, o sistema distribuído foi dividido em duas partes mutuamente incomunicáveis. 3. A escrita mais recente está armazenada no Nó A. 4. Como o Nó B não pode receber mensagens do Nó A, o Nó B não contém os dados mais recentes.

Agora vamos analisar por que esse sistema não pode garantir cada uma dessas três características quando as outras duas já foram alcançadas.

Consistência + Disponibilidade

Se um sistema distribuído for consistente e disponível, toda requisição de leitura recebe uma resposta não de erro contendo os dados mais recentes quando o sistema está em execução. No entanto, não podemos alcançar isso porque o Nó B não pode oferecer os dados mais recentes. Portanto, para garantir consistência e disponibilidade durante o tempo de operação do sistema distribuído, precisamos desligá-lo temporariamente, sacrificando assim a tolerância à partição.

Consistência + Tolerância de Partição

Com essa combinação, nosso sistema precisa continuar rodando e enviar os dados mais recentes, ou um erro quando os dados mais recentes não estão disponíveis, em resposta a solicitações de leitura. Como o Nó B não obteve a escrita mais recente, ele precisa despachar um erro para garantir que o sistema permaneça consistente. Portanto, é impossível nesse cenário garantir a disponibilidade que exija que o Nó B envie uma mensagem que não seja de erro.

Disponibilidade + Tolerância de Partição

Nesse cenário, nosso sistema não pode cessar a operação o tempo todo. Além disso, ele precisa responder a requisições de leitura com mensagens que não sejam de erro. Como a escrita mais recente não é acessível no Nó B, ele não tem escolha a não ser enviar dados antigos em resposta a requisições de leitura, violando consequentemente o que a consistência exige.

Dicas de Como Escolher entre Consistência, Disponibilidade e Tolerância de Partição

Agora que demonstrei que é impossível alcançar consistência, disponibilidade e tolerância de partição ao mesmo tempo, discutirei como escolher entre essas três qualidades desejáveis. Geralmente, precisamos exigir que nossos sistemas distribuídos tolerem particionamento de rede pelos seguintes motivos: 1) particionamento de rede é ubíquo, e 2) queremos que nossos sistemas distribuídos permaneçam operacionais mesmo diante da partição de rede, para que os usuários não fiquem confusos com requisições não tratadas.

Com a tolerância de partições como indispensável, tudo se resume a uma escolha direta entre consistência e disponibilidade. Uma regra prática seria escolher consistência em vez de disponibilidade quando precisamos garantir que os usuários sempre recebam os dados mais precisos. Alguns bons exemplos de sistemas que geralmente buscam consistência e tolerância a partições incluem aplicações desenvolvidas para instituições financeiras, como bancos e bolsas de valores.

Enquanto isso, geralmente preferimos a disponibilidade à consistência quando não estamos dispostos a abrir mão de uma boa experiência do usuário em troca da precisão dos dados. Plataformas de redes sociais e jogos seriam bons exemplos de sistemas que normalmente buscam disponibilidade e tolerância a partições.

Neste artigo, abordei o que o teorema da CAP afirma e mostrei as definições de consistência, disponibilidade e tolerância a partições. Depois disso, expliquei em detalhes por que a trindade de consistência, disponibilidade e tolerância a partições é inalcançável. No final, forneci algumas dicas sobre como tomar decisões sábias nesse trilema. Espero que este artigo tenha ajudado você a obter mais insights sobre o teorema da CAP e como aplicá-lo à sua tomada de decisão ao fazer design de sistemas.

No próximo artigo, discutirei o teorema PACELC, uma versão mais abrangente do teorema CAP. Fiquem ligados!

Related Articles