Consistência de dados: O que é , e por quê você deveria se preocupar ?
Neste artigo, vamos explorar os princípios da consistência de dados, seus desafios em sistemas distribuídos , quais os tipos de consistência de dados e ainda, como escolher entre eles
Mas antesss, me ajuda respondendo essa pesquisa para entregar conteúdos cada vez melhores ? Ao final dela você receberá um presente de uma aula de 1 hora + 1 lista de sites de vagas remotas BRs e gringas.
O Que é Consistência de Dados?
Consistência de dados consiste em, após qualquer operação (inserção, atualização, exclusão) realizada em um banco de dados, o estado final da base deve estar correto. Garantindo que as informações manipuladas sejam válidas, completas e reflitam a realidade.
Um exemplo de cenário que a consistência é essencial: Em um banco de dados de uma loja online, se um cliente finaliza uma compra, o valor cobrado no cartão e o status do pedido devem refletir corretamente essa operação. Se houver alguma inconsistência, como o pedido ser confirmado, mas o pagamento não registrado, isso pode levar a erros graves, como cobrança duplicada ou falta de estoque.
Desafios da Consistência em Sistemas Distribuídos
Conforme os sistemas crescem e se tornam mais distribuídos, a consistência de dados enfrenta novos desafios. Em um ambiente distribuído, como um ecossistema de microsserviços , os dados podem ser replicados em diferentes "nós" geograficamente distantes e passar por diversos sistemas, filas/tópicos até chegar no final do fluxo. Isso aumenta a latência e pode levar a problemas de sincronização.
E é aqui que entra o Teorema CAP (Consistency, Availability, Partition Tolerance), que estabelece que, em um sistema distribuído, só é possível garantir dois dos três atributos simultaneamente:
Consistência: Todos os nós de um sistema veem os mesmos dados ao mesmo tempo.
Disponibilidade: O sistema responde às solicitações, mesmo que parte do sistema tenha falhas.
Tolerância a Partições: O sistema continua funcionando mesmo que haja falhas de comunicação entre os nós.
Em muitos casos, abrimos mão da consistência em favor da disponibilidade e tolerância a partições, especialmente em sistemas onde a alta disponibilidade é crítica, como redes sociais e e-commerces. Nesses casos, opta-se pela consistência eventual (que vamos falar dela mais pra frente)
Tipos de consistência
Consistência forte
A consistência forte garante que, após uma operação de gravação, qualquer leitura subsequente retorna o valor mais recente gravado no sistema. Ou seja, qualquer usuário que acessar o sistema verá imediatamente a versão atualizada dos dados. Em outras palavras, não há margem para discrepância nos dados entre as diferentes réplicas ou nós.
Quando utilizar esse tipo de consistência:
Sistemas de reservas: Em plataformas de reservas de passagens , hotéis e até ingresso de show (quem nunca sofreu clicando no ingresso e ele não estando mais disponível rs), é necessário garantir que um mesmo lugar seja reservado por mais de uma pessoa ao mesmo tempo.
Sistemas financeiros: Em transações bancárias ou sistemas de pagamento, a consistência forte é essencial para garantir que o saldo de uma conta esteja sempre correto após uma operação.
Desvantagens: Esse tipo de consistência aumenta a latência, pois todas as réplicas do sistema precisam estar sincronizadas, o que pode impactar a performance em sistemas distribuídos.
Consistência eventual
A consistência eventual não garante que, imediatamente após uma gravação, todas as réplicas do sistema terão o mesmo valor. Porém, garante que, eventualmente, todas as réplicas irão convergir para o mesmo estado consistente. Nesse formato, um usuário pode ler dados ligeiramente desatualizados, mas após algum tempo, os dados em todos os nós serão consistentes.
Quando utilizar esse tipo de consistência:
Sistemas de cache: Em caches distribuídos, a consistência eventual é útil para garantir alta disponibilidade, dado que um certo nível de desatualização pode ser tolerado.
Redes sociais: Comentários, curtidas e outras interações podem não aparecer instantaneamente para todos os usuários, mas isso é aceitável, pois a consistência imediata não é fator crítico para a experiência
Vantagens: Maior disponibilidade e performance, especialmente em sistemas distribuídos geograficamente, onde a latência de comunicação entre nós pode ser um desafio.
Consistência Causal
A consistência causal visa garantir que as operações que estão logicamente relacionadas (causa e efeito) sejam aplicadas na ordem correta. Se um nó A realiza uma operação que depende de uma ação prévia em um nó B, a ordem dessas ações é preservada. No entanto, a causalidade não garante que todas as operações sejam visíveis imediatamente em todos os nós.
Quando utilizar esse tipo de consistência:
Plataformas de mensagens: Sistemas de chat precisam garantir que as mensagens sejam apresentadas na ordem correta, mantendo o fluxo da conversa entre os usuários.
Aplicações colaborativas: Em ferramentas como Google Docs,Notion, One Note onde múltiplos usuários editam um documento ao mesmo tempo, é importante que as mudanças sigam uma ordem lógica e que uma edição não sobrescreva outra incorretamente.
Vantagens: Ordem lógica garantida, menor latência que a consistência forte, flexibilidade para inconsistências momentâneas
Consistência Monotônica
A consistência monotônica tem como objetivo garantir que, se um nó ou usuário ler um valor de um dado, nunca verá um valor anterior em futuras leituras. Isso quer dizer que, após ler a versão mais recente de um dado, todas as leituras subsequentes retornam aquele valor ou uma versão mais atualizada.
Quando utilizar esse tipo de consistência:
Sistemas de autenticação: Depois de realizar uma alteração em uma senha, o sistema deve garantir que o usuário não verá versões antigas de suas credenciais.
Plataformas de atualização de perfil: Imagine um cenário em que um usuário está atualizando suas preferências em um sistema de e-commerce. É importante que, após salvar a alteração, ele nunca veja uma versão antiga de seus dados em futuras interações.
Vantagens: Experiência de Usuário Coerente, Simplicidade de Implementação, Coerência entre Sistemas Distribuídos, Flexibilidade Comparada à Consistência Forte e Maior Desempenho
Consistência de Sessão
A consistência de sessão é um tipo de consistência que garante que, dentro de uma mesma sessão de um usuário, ele sempre terá acesso aos dados mais recentes que ele próprio gravou. Contudo, outros usuários fora dessa sessão podem ver dados desatualizados até que o sistema converja para um estado consistente.
Quando utilizar esse tipo de consistência:
Plataformas de edição de conteúdo: Em sistemas de gerenciamento de conteúdo, um autor pode querer ver imediatamente suas alterações enquanto edita um artigo, sem afetar a visualização de leitores até que as mudanças sejam publicadas
Vantagens: Desempenho Otimizado, Melhoria na Experiência do Usuário, Baixa Latência e Menos Sobrecarga de Sincronização
Consistência Linearizável
A consistência linearizável é a forma mais forte de consistência que garante que todas as operações sejam aplicadas de forma atômica e globalmente ordenada em tempo real. Isso quer dizer que, uma vez que uma operação é completada, todos os nós do sistema devem imediatamente refletir esse novo estado.
Quando utilizar esse tipo de consistência:
Sistemas críticos: Em sistemas que envolvem dados altamente críticos, por exemplo controle de tráfego aéreo ou redes de telecomunicações, a consistência linearizável pode ser essencial para evitar desastres.
Desvantagens: Altamente custosa em termos de latência e performance, pois exige sincronização imediata entre todos os nós, o que pode impactar severamente a escalabilidade de sistemas distribuídos.
Como escolher o modelo de consistência adequado
A escolha do nível de consistência depende diretamente das necessidades e características da aplicação. Aqui estão algumas dicas gerais para ajudar na escolha:
Aplicações Críticas (financeiras, de segurança ou controle): Consistência forte ou linearizável.
Aplicações com Altas Interações de Usuário (redes sociais, sistemas colaborativos): Consistência eventual ou causal.
Aplicações de Baixa Latência e Alta Disponibilidade: Consistência eventual.
Aplicações de Sessão Única (e-commerce, personalização): Consistência de sessão ou monotônica.
Se você curtiu esse artigo não deixa de se inscrever e compartilhar com mais pessoas , até a próxima Senior Developer News =)