詳細検索

Teorema CAP Mas melhor? Introduza o Teorema PACELC

Avatar
por Chen Ziyu
4 min de leitura

Teorema CAP Mas melhor? Introduza o Teorema PACELC
Traduzido do English • Ver original

No blog anterior, apresentei o famoso Teorema CAP (por favor, leia se ainda não o fez antes de começar a ler este). Envolve um trilema de precisar abrir mão de uma das seguintes três qualidades: consistência, disponibilidade e tolerância a partições. Como todas são características desejáveis dos sistemas distribuídos modernos, determinar qual abrir mão se tornou uma das decisões mais importantes e delicadas para os projetistas de sistemas distribuídos complexos. Embora o Teorema CAP seja amplamente conhecido na ciência da computação, sua extensão, o teorema PACELC, recebeu menos atenção. Hoje, vou lançar um destaque há muito esperado sobre o teorema PACELC.

PACELC-theorem-diagram

Primeiro, vamos começar pelo que o teorema PACELC afirma. Podemos dividir o teorema PACELC em "PAC" e "ELC". "PAC" significa que, se existe uma "partição" de rede, um sistema distribuído precisa escolher entre "disponibilidade" e "consistência". Essa parte é equivalente ao teorema CAP, exceto que pressupõe que sempre priorizamos e consideramos a "tolerância à partição" como algo certo. "ELC" é a ideia inovadora que o teorema PACELC trouxe à mesa. "E", "L" e "C" representam, respectivamente, "else", "latency" e consistência." "ELC" afirma que, se não houver partição de rede ("else"), um sistema distribuído precisa fazer um trade-off entre "latência" e "consistência".

Como já abordamos o teorema do CAP no blog anterior, vamos focar na parte do "ELC" por enquanto. Quais são as definições de latência e consistência?

Latência (ou Baixa Latência)

Oxford Languages define latência como "o atraso antes que uma transferência de dados comece após uma instrução para sua transferência." Dizer que o "L" significa latência é impreciso, já que geralmente buscamos minimizar a latência em sistemas de computação para acelerar as operações. Para tornar o "L" uma qualidade desejada em sistemas distribuídos, prefiro pensar nele como "baixa latência".

Consistência

A consistência em "ELC" é a mesma do teorema CAP. 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.

Uma pergunta óbvia a se fazer neste ponto é: por que não podemos ter baixa latência e consistência quando não há partição de rede? Vou responder a essa pergunta com um exemplo simples.

distributed system

Suponha que temos um sistema distribuído de dois nós: Nó A e Nó B. Na ausência de partições de rede, esses dois nós podem se comunicar facilmente entre si via mensagens. O Nó A acabou de receber a escrita mais recente. Ao mesmo tempo, o Nó B recebeu uma solicitação de leitura solicitando essa escrita específica. Se esse sistema distribuído busca alcançar consistência, o Nó B precisa enviar a escrita mais recente em resposta à solicitação de leitura. Portanto, o Nó B precisa esperar receber os dados mais recentes do Nó A antes de poder atualizar seus dados antigos e responder à solicitação de leitura. Esse atraso basicamente aumenta a latência no sistema distribuído.

Agora que temos certeza de que não podemos ter o melhor dos dois mundos, surge a questão: qual deles devemos escolher em qual situação? Semelhante ao que mencionei no blog anterior, a regra prática é escolher consistência em vez de baixa latência quando a precisão e a atualidade dos dados são de vital importância. Alguns ótimos exemplos de aplicações em busca de consistência o tempo todo incluem aplicações fintech e caixas eletrônicos bancários. Se a precisão e a pontualidade dos dados não forem tão importantes, então baixa latência deveria ter prioridade. Plataformas de redes sociais e jogos são ótimos exemplos de aplicações que buscam baixa latência.

Para resumir, apresentei brevemente o teorema PACELC neste blog. Toquei em como o teorema PACELC estende o teorema CAP e as definições de latência (ou baixa latência) e consistência. Depois, demonstrei por que não podemos alcançar baixa latência e consistência simultaneamente em um sistema distribuído que não está experimentando uma partição de rede. No final, ofereci algumas dicas sobre quando escolher consistência e quando escolher baixa latência. Espero que este artigo tenha ajudado você a obter insights sobre o teorema PACELC e como aplicá-lo ao design de sistemas.

Related Articles