O que é consistência eventual?
A consistência eventual é um modelo de programação no qual os programadores assumem que, por um período de tempo suficientemente longo e sem alterações em um sistema, a versão atual de um programa específico será distribuída até que todas as réplicas do programa sejam consistentes. O conceito de consistência eventual é usado em métodos de programação como replicação otimista, memória compartilhada distribuída e transações distribuídas. Em relação aos bancos de dados, a consistência eventual é obtida através de um processo de três etapas. Primeiro, as informações distribuídas são disponibilizadas no sistema; isso é seguido por um estado flexível, no qual diferentes usuários ainda podem estar trabalhando com diferentes versões dos dados; e finalmente a consistência é alcançada e todos os computadores têm acesso a dados idênticos.
Uma das maneiras mais visíveis de aplicar consistência eventual é a atualização de software distribuída online. Nos primeiros segundos após o lançamento de uma atualização, ninguém a terá; não passou tempo suficiente para os usuários do software baixarem e instalarem a atualização. Este é o estado "disponível"; a atualização existe, mas ainda não foi distribuída. Com o tempo, à medida que os usuários baixam a atualização, alguns a terão e outras não. Depois de um tempo suficiente, todos que usam o software serão atualizados para a versão mais recente. Essa é a premissa por trás do estado de consistência eventual: dado tempo suficiente, qualquer atualização será propagada completamente em todo o sistema.
À medida que o sistema trabalha para uma consistência eventual, os conflitos são inevitáveis. Isso ocorre quando a versão do programa ou as informações atualmente no computador não correspondem à "versão do modelo" do programa. Os programas geralmente são configurados para reconhecer esses conflitos e gerenciá-los. Quando os arquivos em um computador específico são mais antigos que a versão mais recente do software ou dados em questão, o sistema geralmente solicita que o usuário inicie uma atualização para resolver a disparidade.
Três métodos possíveis estão disponíveis para efetuar essas resoluções: reparo de gravação, reparo de leitura e reparo assíncrono. Todos esses métodos alinham a versão do programa ou dos dados ao modelo consistente. A principal diferença entre elas tem a ver com a maneira como o sistema cronometra a operação de reparo. Todas essas operações têm vantagens e desvantagens.
Em um reparo de gravação, as alterações no código armazenado no computador são feitas durante uma operação de gravação, quando o computador já está gravando algo no disco rígido do sistema. Isso repara a inconsistência, alinhando o programa ou os dados com o modelo, mas também retarda temporariamente a operação de gravação original. Para um reparo de leitura, a operação corretiva ocorre durante um ciclo de leitura do disco rígido. Isso, por sua vez, diminui a operação de leitura. No reparo assíncrono, o reparo ocorre quando nenhuma operação de leitura ou gravação ocorre, levando ao consumo de ciclos inativos na CPU.