Menu Docs
Página inicial do Docs
/ /
Serviços Atlas App
/ /

Resolução de conflitos

Nesta página

  • Regras de resolução de conflitos
  • Considerações especiais
  • Contadores
  • Coleções agrupadas
  • Strings
  • Dicionários
  • Resolução personalizada de conflitos
  • Resumo

Os conflitos surgem quando dois ou mais usuários fazem alterações na mesma parte dos dados de forma independente. Isso pode acontecer devido à latência entre o dispositivo e o servidor ou perda de conectividade. Neste evento, o Atlas Device Sync utiliza automaticamente estratégias de resolução de conflitos para mesclar as alterações. Especificamente, a Device Sync lida com a resolução de conflitos usandoa transformação operacional , um conjunto de regras que garantem forte consistência eventual, o que significa que as versões de todos os clientes acabarão se convertendo em estados idênticos. Isso será verdade mesmo que as alterações tenham sido feitas em uma ordem diferente.

Você deve estar ciente das regras para garantir resultados consistentes, mas a vantagem é que, seguindo essas regras, você pode fazer com que os dispositivos funcionem totalmente offline e ainda convirjam para resultados significativos quando se encontram.

Esta página usa o exemplo de um aplicativo para passear com cães para ilustrar como o Device Sync resolve conflitos. Nesta aplicação, Matt e Sarah são passeadores de cães que usam o aplicativo para rastrear os cães de seus clientes e seus horários de passeios.

Em um nível muito alto, as regras são as seguintes:

As exclusões sempre vencem.
Se um lado excluir um objeto, ele sempre permanecerá excluído, mesmo que o outro lado tenha feito alterações nele mais tarde.
Última atualização ganha.
Se dois lados atualizarem a mesma propriedade, a sincronização do dispositivo manterá o valor da atualização mais recente.
Inserções em listas são ordenadas por tempo.
Se dois itens forem inseridos na mesma posição, o item que foi inserido primeiro acabará antes do outro item. Isso significa que, se ambos os lados acrescentarem itens ao final de uma lista, incluirão ambos os itens em ordem de tempo de inserção.
As chaves primárias designam a identidade do objeto.
Se ambos os lados criarem objetos da mesma classe com chaves primárias idênticas, eles serão tratados como instâncias do mesmo objeto.

Exemplo

Resolução de conflitos entre dois usuários

Matt e Sarah estão trabalhando em dados para seu negócio de passear com cães. Matt exclui dados de um dos cachorros de seus clientes, Doug, pois eles não precisam mais orientá-lo. Enquanto Sarah está sem conexão com a internet, ela edita os dados de tempo de caminhada necessários de Doug em sua versão local offline, pois ela não sabe sobre a exclusão de Matt dos dados de Doug.

Quando Sarah recuperar a conexão com a Internet, sua alteração será enviada ao servidor. O servidor enviará a operação de exclusão do Matt. Como as exclusões sempre vencem de acordo com as regras de resolução de conflitos do Device Sync, a exclusão de Matt é mantida em vez da edição de Sarah. O servidor não enviará as edições de Sarah para o dispositivo do Matt. Os dados estão novamente de acordo nos dispositivos de Matt e Sarah.

Usar números inteiros para contar é um caso especial. A maneira como a maioria das linguagens de programação implementaria uma operação de incremento (como v += 1) é ler o valor, incrementar o resultado e, em seguida, armazená-lo de volta. Isso obviamente não funcionará se você tiver várias partes fazendo incremento simultaneamente (ambos podem ler 10, incrementá-lo para 11 e, quando ele for mesclado, você obterá um resultado de 11 em vez do 12 pretendido).

Para dar suporte a esse caso comum, oferecemos uma maneira de expressar se você está incrementando (ou decrementando) o valor, dando dicas suficientes para que a mesclagem possa chegar ao resultado correto. Você tem a opção de atualizar todo o valor ou editá-lo de uma forma que transmita mais significado, o que lhe permite obter um controle mais preciso da resolução do conflito.

As coleções aninhadas são tratadas da mesma forma que os objetos incorporados. Ou seja, eles são considerados objetos filhos com um objeto pai específico. Quaisquer atualizações no objeto pai sempre vencerão em uma resolução de conflito, mesmo que substitua o objeto filho.

As atualizações de uma collection aninhada são resolvidas da seguinte forma:

  • Se vários dispositivos atualizarem a mesma coleção aninhada existente, o Device Sync usará regras normais de resolução de conflitos para incorporar ambas as alterações.

  • Se vários dispositivos criarem novas coleções exclusivas aninhadas no mesmo objeto pai, a regra "última atualização ganha" se aplicará e o Device Sync substituirá todas as outras atualizações pela última atualização feita.

Por exemplo, os detalhes do cliente no aplicativo para passear com cães de Sarah e Matt são modelados como arrays aninhados na propriedade pai client . Sarah - e, mais tarde, Matt - cria uma nova coleção de detalhes para o mesmo cliente em seus dispositivos enquanto estiver off-line. Quando os dispositivos sincronizam, o Device Sync mantém a entrada criada por Matt porque sua atualização (criando uma nova coleção de detalhes aninhada) foi a última feita.

Mais tarde, Sarah e Matt fazem atualizações exclusivas na entrada de detalhes recém-criada. O Device Sync mesclará essas atualizações de acordo com as regras normais de resolução de conflitos, inserindo os itens novos ou modificados na lista em ordem cronológica.

O Device Sync interpreta o valor de uma string como um todo e não mescla conflitos por caractere. Por exemplo, isso significa que, se um caractere ou substring for inserido ou excluído em uma string, o Device Sync tratará isso como uma substituição de todo o valor da string.

O Device Sync considera a remoção de uma chave de dicionário uma atualização, em vez de uma exclusão. Como resultado, a regra "Last update wins" é aplicada em vez da regra "Exclui sempre vencer".

Por exemplo, o aplicativo para passear com cães contém uma coleção opcional de detalhes para cada cão, que são inseridos como valores-chave. Enquanto ambos os usuários estão offline, Sarah exclui toda a entrada de favorite toy para um cachorro e, mais tarde, Matt atualiza o brinquedo favorito do mesmo cachorro para tennis ball. Quando ambos voltam online, o Device Sync considera ambos como atualizações na entrada favorite toy e aplica as atualizações de Matt porque ele as criou após a exclusão de Sarah.

De modo geral, a resolução de conflitos da Device Sync deve funcionar para a maioria dos fins, e você não precisa personalizá-la. Dito isto, a forma típica de fazer a resolução de conflitos personalizada é alterar um tipo de propriedade de string para lista. Cada lado pode então adicionar suas atualizações à lista e aplicar as regras de resolução de conflitos que desejar diretamente no modelo de dados. Você pode usar essa técnica para implementar max, min, first write wins, last write wins, or any other kind of resolution you can think of.

  • O Device Sync implementa um sistema de resolução de conflitos para permitir que vários gravadores off-line gravem simultaneamente e, ainda assim, acabem convergindo para o mesmo resultado.

  • O sistema de resolução de conflitos segue quatro regras:
    • As exclusões sempre vencem.

    • A última atualização ganha.

    • Inserções em listas são ordenadas por tempo.

    • As chaves primárias designam a identidade do objeto.

  • Contadores, coleções aninhadas e strings são casos especiais a serem observados no código do cliente.

Voltar

Detalhes técnicos