Costumo ouvir sobre a consistência eventual em diferentes discursos sobre NoSQL, grades de dados etc. Parece que a definição de consistência eventual varia em muitas fontes (e talvez até dependa de um armazenamento de dados concreto).
Alguém pode dar uma explicação simples sobre o que é Consistência Eventual em termos gerais, não relacionada a nenhum armazenamento de dados concreto?
Respostas:
Eventual consistência:
Eventualmente, todos os servidores (você, eu, seu vizinho) sabem a verdade (que vai chover amanhã), mas, enquanto isso, o cliente (a esposa) saiu pensando que vai fazer sol, mesmo que ela tenha perguntado depois que um ou mais servidores (você e eu) tivessem um valor mais atualizado.
Ao contrário da conformidade estrita com consistência / ACID:
Em nenhum momento, seu saldo poderá refletir outra coisa senão a soma real de todas as transações feitas na sua conta naquele exato momento.
A razão pela qual tantos sistemas NoSQL têm consistência eventual é que praticamente todos eles são projetados para serem distribuídos e, com sistemas totalmente distribuídos, existe uma sobrecarga super-linear para manter a consistência estrita (o que significa que você só pode escalar até agora antes que as coisas comecem a desacelerar). quando você precisar jogar exponencialmente mais hardware no problema para continuar dimensionando).
fonte
Eventual consistência:
Basicamente, porque leva tempo para replicar os dados em vários servidores, os pedidos de leitura dos dados podem ir para um servidor com uma nova cópia e depois para um servidor com uma cópia antiga. O termo "eventual" significa que, eventualmente, os dados serão replicados para todos os servidores e, portanto, todos terão a cópia atualizada.
A consistência eventual é essencial se você deseja leituras de baixa latência, pois o servidor que responde deve retornar sua própria cópia dos dados e não tem tempo para consultar outros servidores e chegar a um acordo mútuo sobre o conteúdo dos dados. Eu escrevi um post explicando isso em mais detalhes.
fonte
Pense que você tem um aplicativo e sua réplica. Então você precisa adicionar um novo item de dados ao aplicativo.
Em seguida, o aplicativo sincroniza os dados com outras réplicas mostradas abaixo
Enquanto isso, o novo cliente obtém dados de uma réplica que ainda não é atualizada. Nesse caso, ele não pode obter dados de data corretos. Porque a sincronização demora algum tempo. Nesse caso, não tem consistência
O problema é como podemos eventualmente ter consistência ?
Para isso, usamos o aplicativo mediador para atualizar / criar / excluir dados e usar consultas diretas para ler dados. que ajudam a criar consistência
fonte
Quando um aplicativo faz uma alteração em um item de dados em uma máquina, essa alteração deve ser propagada para as outras réplicas. Como a propagação da mudança não é instantânea, há um intervalo de tempo durante o qual algumas cópias terão as alterações mais recentes, mas outras não. Em outras palavras, as cópias serão mutuamente inconsistentes. No entanto, a mudança será propagada para todas as cópias e, portanto, o termo "consistência eventual". O termo consistência eventual é simplesmente um reconhecimento de que há um atraso ilimitado na propagação de uma alteração feita em uma máquina para todas as outras cópias. A consistência eventual não é significativa ou relevante em sistemas centralizados (cópia única), pois não há necessidade de propagação.
fonte: http://www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf
fonte
Em inglês simples, podemos dizer: Embora seu sistema possa estar em estados inconsistentes, o objetivo é sempre alcançar a consistência em algum momento de cada parte dos dados.
fonte
Eventualmente, consistência significa que as mudanças levam tempo para se propagar e os dados podem não estar no mesmo estado após cada ação, mesmo para ações ou transformações idênticas dos dados. Isso pode causar coisas muito ruins quando as pessoas não sabem o que estão fazendo ao interagir com esse sistema.
Não implemente armazenamentos de dados de documentos críticos para os negócios até entender bem esse conceito. Estragar a implementação de um repositório de dados de documentos é muito mais difícil de consertar do que um modelo relacional, porque as coisas fundamentais que serão estragadas simplesmente não podem ser consertadas, pois as coisas necessárias para consertá-las simplesmente não estão presentes no ecossistema. Refatorar os dados de um armazenamento de bordo também é muito mais difícil do que as simples transformações de ETL de um RDBMS.
Nem todos os armazenamentos de documentos são criados iguais. Hoje em dia (MongoDB) oferece suporte a transações de um tipo, mas a migração de datastores é provavelmente comparável à despesa de reimplementação.
AVISO: desenvolvedores e até arquitetos que não conhecem ou entendem a tecnologia de um repositório de dados de documentos e têm medo de admitir isso por medo de perder o emprego, mas foram treinados classicamente em RDBMS e que conhecem apenas sistemas ACID (quão diferente pode ser ?) e quem não conhece a tecnologia ou não dispõe de tempo para aprender, sentirá falta de projetar um armazenamento de dados de documentos. Eles também podem tentar usá-lo como um RDBMS ou para coisas como armazenamento em cache. Eles dividem o que deveriam ser transações atômicas que deveriam operar em um documento inteiro em partes "relacionais", esquecendo que replicação e latência são coisas, ou pior ainda, arrastando sistemas de terceiros para uma "transação". Eles farão isso para que seu RDBMS possa espelhar seu data lake, sem considerar se funcionará ou não e sem testes, porque eles sabem o que estão fazendo. Eles ficarão surpresos quando objetos complexos armazenados em documentos separados, como "pedidos", tiverem menos "itens do pedido" do que o esperado, ou talvez nenhum. Mas isso não vai acontecer com frequência, ou com frequência suficiente, para que eles simplesmente marchem para a frente. Eles podem até não acertar no problema do desenvolvimento. Então, em vez de redesenhar as coisas, eles lançam "atrasos" e "tentativas" e "fazem check-in" para falsificar um modelo de dados relacionais, o que não funcionará, mas acrescentará complexidade adicional sem nenhum benefício. Mas agora é tarde demais - a coisa foi implantada e agora os negócios estão sendo executados. Eventualmente, todo o sistema será descartado, o departamento será terceirizado e outra pessoa o manterá. Ainda não funcionará corretamente, mas eles podem falhar menos que a falha atual.
fonte
A consistência eventual é mais como um espectro. Por um lado, você tem uma consistência forte e, por outro, uma consistência eventual. No meio, existem níveis como Snapshot, leia minhas gravações, rigidez limitada. Doug Terry tem uma bela explicação em seu artigo sobre eventual consistência no beisebol .
De acordo com mim, a consistência eventual é basicamente a tolerância a dados aleatórios em ordem aleatória toda vez que você lê em um repositório de dados. Qualquer coisa melhor que isso é um modelo de consistência mais forte. Por exemplo, um instantâneo possui dados obsoletos, mas retornará os mesmos dados se forem lidos novamente, portanto, é previsível. Às vezes, o aplicativo pode tolerar dados obsoletos por um determinado período de tempo, além do qual exige dados consistentes.
Se você observar o significado da consistência, ele se relaciona mais à uniformidade ou falta de desvio. Portanto, em termos que não são de computadores, isso pode significar tolerância a variações inesperadas. Poderia ser muito bem explicado através do caixa eletrônico. Um caixa eletrônico pode estar offline e, portanto, divergir do saldo da conta dos sistemas principais. No entanto, há uma tolerância em mostrar saldos diferentes para uma janela de tempo. Quando o ATM fica on-line, ele pode sincronizar com os principais sistemas e refletir o mesmo equilíbrio. Assim, pode-se dizer que um caixa eletrônico é eventualmente consistente.
fonte