HomeSharpStack
offline-first5 min

Entendendo Modelos de Consistência de Dados em Aplicações Offline

Entendendo Modelos de Consistência de Dados em Aplicações Offline

Quando você constrói um aplicativo que funciona sem internet, precisa decidir como seus dados se comportam quando o dispositivo está desconectado. Imagine um caderno compartilhado entre amigos: se todos escrevem ao mesmo tempo em páginas diferentes, como você garante que ninguém perde informações? É exatamente isso que os modelos de consistência resolvem.

O que é Consistência de Dados?

Consistência significa que todos os dispositivos veem os mesmos dados no mesmo momento. Em aplicações offline, isso é complicado porque:

  • Seu telefone pode estar sem internet
  • Outro usuário está editando os mesmos dados em outro lugar
  • Quando a conexão volta, os dados precisam se sincronizar

Existem três modelos principais para lidar com isso. Vamos explorar cada um com analogias do mundo real.

1. Consistência Forte (Strong Consistency)

Analogia: Imagine um banco com um único caixa. Antes de qualquer transação ser confirmada, o gerente verifica pessoalmente se há dinheiro suficiente. Ninguém pode sacar dinheiro até essa verificação estar 100% completa.

Na consistência forte, todos os dados devem estar sincronizados antes de qualquer operação ser confirmada. Se você está offline, o aplicativo não permite que você faça alterações até reconectar.

// Pseudocódigo: Consistência Forte
bool salvarDado(string chave, string valor) {
    // Só salva se conseguir conectar ao servidor
    if (!temConexao()) {
        return false; // Operação rejeitada
    }
    
    // Verifica se o servidor confirmou
    bool confirmado = enviarParaServidor(chave, valor);
    if (confirmado) {
        salvarLocalmente(chave, valor);
        return true;
    }
    return false;
}

Vantagens: Seus dados sempre estão corretos e sincronizados.

Desvantagens: Sem internet = sem funcionalidade. Péssimo para apps offline!

2. Consistência Eventual (Eventual Consistency)

Analogia: Imagine um grupo de amigos compartilhando uma lista de compras no WhatsApp. Cada um escreve sua mensagem imediatamente, mesmo que nem todos vejam no mesmo segundo. Eventualmente, todos recebem todas as mensagens e veem a lista completa.

Na consistência eventual, você pode fazer alterações offline, e elas sincronizam quando a conexão volta. Diferentes dispositivos podem ver dados diferentes temporariamente, mas eventualmente convergem para o mesmo estado.

// Pseudocódigo: Consistência Eventual
void salvarDado(string chave, string valor) {
    // Salva imediatamente no dispositivo
    salvarLocalmente(chave, valor);
    
    // Tenta enviar para o servidor (sem bloquear)
    if (temConexao()) {
        enviarParaServidorAssincrono(chave, valor);
    } else {
        // Marca para sincronizar depois
        adicionarFilaSincronizacao(chave, valor);
    }
}

Vantagens: Funciona perfeitamente offline. Aplicativo sempre responsivo.

Desvantagens: Dados podem estar desatualizados temporariamente. Conflitos podem ocorrer se dois usuários editam a mesma coisa.

3. Consistência Causal (Causal Consistency)

Analogia: Imagine uma conversa em um grupo de chat. Se você responde a uma mensagem, todos veem sua resposta depois da mensagem original. A ordem causa-efeito é preservada, mesmo que nem todos vejam tudo no mesmo instante.

Na consistência causal, operações relacionadas mantêm sua ordem. Se a operação B depende da operação A, todos veem A antes de B. Mas operações independentes podem ser vistas em ordem diferente em diferentes dispositivos.

// Pseudocódigo: Consistência Causal
struct Operacao {
    string id;
    string chave;
    string valor;
    vector dependeDe; // IDs das operações anteriores
};

void salvarComDependencia(Operacao op) {
    // Só aplica se todas as dependências foram aplicadas
    if (todasDependenciasAplicadas(op.dependeDe)) {
        salvarLocalmente(op);
        adicionarFilaSincronizacao(op);
    }
}

Vantagens: Funciona offline e mantém lógica de causa-efeito.

Desvantagens: Mais complexo de implementar. Requer rastreamento de dependências.

Comparação Rápida

Modelo Funciona Offline? Sempre Correto? Complexidade
Forte ❌ Não ✅ Sim Baixa
Eventual ✅ Sim ⏳ Depois Média
Causal ✅ Sim ✅ Sim (com ordem) Alta

Qual Escolher?

Use Consistência Forte quando: você precisa de dados 100% corretos e a internet é confiável (ex: transações bancárias).

Use Consistência Eventual quando: o aplicativo precisa funcionar offline e pequenas inconsistências temporárias são aceitáveis (ex: lista de tarefas, notas).

Use Consistência Causal quando: a ordem das operações importa, mas você quer funcionalidade offline (ex: comentários em um documento).

Key Takeaways

  • Consistência forte garante dados sempre corretos, mas não funciona bem offline; consistência eventual permite funcionalidade offline mas dados podem estar temporariamente desatualizados; consistência causal equilibra ambos mantendo a ordem lógica das operações.
  • Escolher o modelo certo depende do seu caso de uso: aplicativos que precisam funcionar offline devem usar eventual ou causal, enquanto aplicativos que exigem precisão absoluta podem usar forte.
  • Em aplicações offline-first, você geralmente salva dados localmente primeiro e sincroniza depois, o oposto de aplicativos online-first que verificam com o servidor antes de confirmar.

Enjoyed this reading?

SharpStack delivers personalized tech readings every day, calibrated to your skill level. 5 minutes a day to stay sharp.

“Stay sharp. At your pace. Everyday.”