CAP Theorem e pragmatismo nos estudos
Tags: systemdesign, career, computerscience, interview
Published: 2023-04-06 10:58:41

Já ouviu a palavra do CAP Theorem?

Antes de entrar nos pormenores do que é o teorema, ou qualquer outra coisa, quero dar uma palavrinha do pq acho importante saber sobre.

# Motivos:

1 - Algum dia, na sua carreira, VOCÊ vai ser o responsável por tomar as decisões, em um cargo de Staff / Principal é esperado que vc seja capaz de tomar essas decisões sozinho, embora sempre haverão pessoas para revisar e ajudar.

2 - Motivo prático pra vc independente de nível, PASSAR NA PORRA DA ENTREVISTA. Maioria das empresas mais sérias hoje em dia vai te apresentar um challengezinho de system design pra vc resolver, e aí entra vc realmente saber fazer o design de um sistema DISTRIBUÍDO, não tem como atingir escalas colossais sem particionar os dados, desculpa, é isso, a vida é dura xD.

Vou deixar ao final algumas refs para consulta posterior, afinal, tem muita gente que saberia explicar melhor o que é o CAP do que eu, risos, mas pro post não ficar incompleto e vc ter que digitar isso no Google (ou chatGPT hoje em dia né) vou te poupar o trabalho.

# O que é o CAP theorem?

Em sistemas de computador distribuídos, conseguimos ter ao mesmo tempo somente 2 dessas 3 garantias, quando se trata de ações read / write.

## Consistency, Availability and Partition tolerance

Consistência é a capacidade de retornar uma leitura mais recente dos dados ou um erro

Disponibilidade (Availability) é a capacidade de sempre retornar uma resposta razoável dentro de um espaço de tempo razoável.

Tolerância a particionamento (Partition tolerance) é a capacidade de o sistema continuar funcionando mesmo haja erro de comunicação entre os seus componentes (nodes).

# Pra que serve o CAP theorem?

Primeiramente pra ser contratado xD
Brincadeiras a parte, é importante ter em mente os tradeoffs que irá fazer no seu sistema, todo mundo quer ter os 3 porém, como diz o teorema, é meio que impossível.

Agora, dessas 3 garantias, Partition tolerance é a que já vem de graça, networks (redes de computadores) são UNRELIABLE (não dá pra confiar), afinal vc consegue escolher quando sua internet vai cair? acho que não né, senão vc ja tinha saido do Bronze no LoLzin certo?

Então, sobre o CAP theorem, basicamente vc vai escolher entre duas coisas:
- ter mais consistência, e nesse caso seu sistema deve demandar mais read / writes atômicos (não alahu akbar mas sim atomicidade mesmo, do ACID de DBs, ou seja, ou aquele átomo de transação ocorre ou tudo dá pau).
- ter mais availability, e ai seu sistema permite consistência eventual e prefere não apresentar erros pro usuário (outro tópico bem grande, mas basicamente é a habilidade de replicar dados entre os vários nodes e tudo bem se um usuário ver algum dado desatualizado, tipo email, vc mandou mas não necessariamente já chegou na caixa de spam do amiguinho, mas vc sabe que uma hora chega xD).

Então por hoje é isso amigos, próximo post já tem tema definido, padrões para implementação de consistência e de disponibilidade.

Refs
[Repo do github para estudos de system design](https://github.com/donnemartin/system-design-primer#availability-vs-consistency)
[Post esclarecedor sobre o teorema](https://robertgreiner.com/cap-theorem-revisited/)
[wikipedia](https://en.wikipedia.org/wiki/CAP_theorem)
[pergunta esclarecedora no stackoverflow](https://stackoverflow.com/questions/12346326/cap-theorem-availability-and-partition-tolerance)

OBS: Aprendam ingles pra ontem, não deve ser novidade pra ninguém que maioria do conteúdo tech está em ingles.