Consistência eventual em inglês simples

130

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?

romano
fonte
1
Por exemplo, a Wikipedia não ajudou? en.wikipedia.org/wiki/consistency virtual
Oliver Charlesworth
21
@OliCharlesworth: não. Talvez seja só eu, mas não é absolutamente claro, mesmo depois de ler duas vezes.
Roman

Respostas:

228

Eventual consistência:

  1. Eu assisto o boletim meteorológico e aprendo que vai chover amanhã.
  2. Eu lhe digo que vai chover amanhã.
  3. Seu vizinho diz à esposa que amanhã estará ensolarado.
  4. Você diz ao seu vizinho que vai chover amanhã.

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:

  1. Seu saldo bancário é de US $ 50.
  2. Você deposita $ 100.
  3. Seu saldo bancário, consultado em qualquer caixa eletrônico em qualquer lugar, é de US $ 150.
  4. Sua filha retira US $ 40 com seu cartão ATM.
  5. Seu saldo bancário, consultado em qualquer caixa eletrônico em qualquer lugar, é de US $ 110.

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).

Chris Shain
fonte
Eu não entendi. O crescimento é linear ou exponencial?
Maciek Kreft
4
O crescimento na sobrecarga de comunicação de um sistema de N nós estritamente consistentes é geralmente entendido como super-linear (isto é, mais que linear). Pode ser exponencial, pode ser cúbico ... Depende do protocolo de comunicação, etc. #
Chris Shain
2
Boa resposta. Algumas perguntas de acompanhamento: não é "ruim" que solicitações para um servidor possam obter informações incorretas / desatualizadas? As pessoas concordam com isso ou há uma solução para isso? Além disso, como os dados são eventualmente replicados em diferentes servidores? Se um dos servidores caiu e os dados estão sendo replicados entre os servidores, se o servidor voltar a funcionar, como os dados serão atualizados?
noblerare
5
@noblerare é "ruim" para vários graus de maldade. Seria muito ruim se meu saldo em caixas eletrônicos estivesse desatualizado. É menos ruim se meu banco de dados de registro não estiver totalmente atualizado ou se meu feed do Facebook estiver alguns segundos atrás. Os mecanismos de replicação e durabilidade dos dados são muito variados e dependem da plataforma específica. Para Cassandra (como exemplo), o escritor pode decidir se, para que uma gravação em particular seja bem-sucedida, ela precisa ser confirmada em um, todos ou em um quorum (maioria) de nós. O HBase adota uma abordagem diferente, na qual um nó específico é o "mestre" de cada linha de dados.
21418 Chris Shain
Na verdade, a maioria dos sistemas bancários é eventualmente consistente.
Caos
106

Eventual consistência:

  1. Seus dados são replicados em vários servidores
  2. Seus clientes podem acessar qualquer um dos servidores para recuperar os dados
  3. Alguém grava um dado em um dos servidores, mas ele ainda não foi copiado para o resto
  4. Um cliente acessa o servidor com os dados e obtém a cópia mais atualizada
  5. Um cliente diferente (ou mesmo o mesmo cliente) acessa um servidor diferente (que ainda não obteve a nova cópia) e obtém a cópia antiga

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.

Ezra Hoch
fonte
2
Bom post no blog. Vale a pena ler para alguém novo na idéia de consistência eventual. Essa resposta seria melhor se fosse reescrita para explicar mais do que está na postagem do blog.
axiopisty
1
Bem explicado em seu blog. Obrigado por compartilhar.
Ataur Rahman Munna
12

Pense que você tem um aplicativo e sua réplica. Então você precisa adicionar um novo item de dados ao aplicativo.

insira a descrição da imagem aqui

Em seguida, o aplicativo sincroniza os dados com outras réplicas mostradas abaixo

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui insira a descrição da imagem aqui

wthamira
fonte
3

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

Alice
fonte
1

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.

Alireza Rahmani Khalili
fonte
1

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.

ggb667
fonte
0

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.

Shripad
fonte