O Que É Consistência Eventual? Convergindo ao Longo do Tempo
Consistência eventual é um modelo em que, após uma mudança, réplicas ou read models ficam consistentes ao longo do tempo em vez de instantaneamente.
Em um sistema distribuído você muitas vezes não pode ter dados instantâneos e consistentes em todos os lugares sem sacrificar disponibilidade ou velocidade. A consistência eventual aceita uma breve janela em que partes diferentes veem valores diferentes, com a garantia de que, na ausência de novas escritas, tudo converge. Entender essa janela é essencial para construir, e testar, sistemas distribuídos.
O que a garantia realmente diz
A consistência eventual promete que, se nenhuma nova atualização ocorrer, todas as réplicas acabarão retornando o último valor escrito. Ela não promete quando. Durante a janela de convergência, dois leitores podem legitimamente ver dados diferentes.
Por que sistemas a aceitam
- Maior disponibilidade: nós servem leituras sem esperar por uma concordância global.
- Menor latência: sem coordenação síncrona entre regiões.
- Melhor escalabilidade entre réplicas e regiões.
- Muitas vezes é a única escolha prática em designs orientados a eventos.
Projetando ao redor da janela
Você esconde ou abraça o lag: garantias de read-your-own-writes, UI otimista, carimbos de versão ou resolução de conflitos. Fingir que o sistema é fortemente consistente quando não é, é de onde vêm os bugs de consistência eventual.
A armadilha dos testes
Consistência eventual é uma das principais causas de testes instáveis. Um teste que escreve e então lê imediatamente pode falhar de forma intermitente porque o read model não acompanhou. A correção é fazer polling com um timeout ou esperar por um sinal de convergência, não adicionar um sleep fixo.
Deploys e leituras obsoletas
Durante um deploy, réplicas ou projeções podem servir brevemente dados obsoletos. Projetar features para tolerar isso, e não assumir que uma escrita é instantaneamente visível em todos os lugares, mantém os rollouts suaves em vez de surpreendentes.
Estabilizando testes de convergência
Testes de convergência que fazem poll e esperam rodam por mais tempo do que asserções instantâneas. Runners rápidos e consistentes (como os que o Latchkey fornece) reduzem a instabilidade relacionada a timing para que esses testes permaneçam confiáveis.
Principais conclusões
- Consistência eventual garante convergência ao longo do tempo, não concordância instantânea.
- Ela troca consistência imediata por disponibilidade, latência e escala.
- É uma causa principal de testes instáveis, então espere pela convergência em vez de dormir.