Práticas recomendadas e tutoriais

Desmistificando a resolução de conflitos no Couchbase Mobile

Os conflitos podem ocorrer em ambientes de replicação em que um documento pode ser atualizado simultaneamente por um ou mais gravadores. Isso é especialmente comum em ambientes móveis, nos quais conexões de rede não confiáveis podem fazer com que as alterações simultâneas de vários dispositivos não sejam sincronizadas em tempo hábil, resultando em conflitos.

Nesta postagem, discutimos os fundamentos de como os conflitos são tratados no Couchbase Mobile e descrevemos a função dos aplicativos na resolução de conflitos. Em uma próxima publicação, discutiremos um tópico relacionado ao gerenciamento de árvores de revisão e tamanhos de banco de dados em um sistema de gerenciamento de documentos baseado em revisão.

O processo de resolução de conflitos discutido neste blog se aplica ao Couchbase Mobile 1.x. Confira este postagem sobre os detalhes do processo de resolução automática de conflitos no Couchbase Mobile 2.x. Confira nosso documentação para uma discussão sobre a resolução de conflitos personalizada no Couchbase Mobile 2.x.


A ilustração abaixo descreve um cenário em que podem ocorrer conflitos em ambientes móveis

Basics of how conflicts created

 

Histórico

O Couchbase Mobile A pilha inclui o Couchbase Lite banco de dados incorporado executado localmente em dispositivos e Gateway de sincronização na nuvem, que normalmente é apoiada por Servidor Couchbase mantendo os dados na nuvem. O Sync Gateway lida com a replicação de documentos entre os dispositivos. É concebível que um documento possa ser atualizado por vários dispositivos ao mesmo tempo.

 

Controle de simultaneidade de várias versões

O Couchbase Mobile usa a técnica de controle de simultaneidade de várias versões (MVCC) para lidar com conflitos. Nesse método, cada documento recebe uma ID de revisão exclusiva gerada pelo sistema. Esse ID é adicional ao ID do documento, que permanece o mesmo em todas as revisões do documento. Toda alteração em um documento, seja ela uma modificação ou uma exclusão, é tratada como uma nova revisão do documento e, portanto, recebe um novo ID de revisão.

Árvore de revisão

Sempre que uma alteração for feita em um documento existente, o redator deverá incluir o ID de revisão da revisão atual do documento que está sendo atualizado. Uma nova revisão é criada para a alteração e adicionada como um nó filho à revisão atual que estava sendo atualizada, resultando em uma árvore de revisão para o documento.

Cada documento tem uma árvore de revisão associada que cresce ao longo da vida útil do documento. Discutiremos técnicas para gerenciar o tamanho da árvore em um post futuro - fique atento!

Estrutura do documento

Em um nível muito alto, cada documento no Couchbase Mobile V1.4 é composto de um ID de documento, ID de revisão atual, corpo JSON e metadados. Os metadados, entre outras coisas, contêm o histórico de revisão do documento. Os metadados são um conceito de "bastidores", e os aplicativos de usuário nunca devem se preocupar com eles. De fato, em versão futura do Couchbase, os metadados serão movidos completamente para fora do documento e para um XATTR.

Além disso, cada revisão de documento tem um valor TTL associado (que tem como padrão 5 minutos).

Revisões de lápides

Em um sistema baseado em MVCC, toda atualização, incluindo uma operação de exclusão, cria uma revisão de documento. As revisões excluídas são chamadas de revisões "Tombstone". Uma revisão excluída é essencialmente uma revisão especial que tem a propriedade "_deleted" como verdadeira. As revisões de exclusão são replicadas. Essas revisões são especiais, pois se você fizer uma consulta no Couchbase Lite, elas não serão retornadas.

Revision Tombstone

A estrutura de ID da revisão

A ID de revisão tem o formato "-"

  •   ID da geração (nova revisão) = ID da geração (pai da revisão) + 1

A primeira revisão que é criada quando um documento é criado tem um ID de geração de 1

  • ID do hash do conteúdo =  hash calculado a partir do conteúdo da revisão

Isso implica que duas revisões de um documento com conteúdo idêntico terão o mesmo ID de hash de conteúdo.

Observação: Como otimização, se dois escritores fizerem alterações idênticas em um documento simultaneamente, resultando em duas revisões de entrada com o mesmo ID de revisão, o Couchbase Mobile armazenará apenas uma única revisão.

 Conflitos

Em um sistema baseado em MVCC, ocorre um conflito se o sistema encontrar uma ramificação na árvore. A partir da discussão sobre árvores de revisão, você pode inferir que esse seria o caso em que há dois ou mais nós de folha na árvore.

conflict branch

Revisão atual

Quando ocorre um conflito, o Couchbase Mobile ainda precisa selecionar um "vencedor" ou "Revisão atual" entre os nós folha conflitantes. A escolha de um vencedor não significa que o conflito foi resolvido.

O Couchbase Mobile escolhe um vencedor de forma determinística. Devido à natureza determinística do processo, não há necessidade de os nós do Couchbase Mobile se comunicarem entre si para escolher os vencedores - todos eles escolhem o mesmo vencedor usando os seguintes critérios

Caso 1: Todas as revisões de folhas não são excluídas

  • O vencedor é a revisão de folha não excluída no ramo de revisão mais longo

current revision - case1

Caso 2: Todas as revisões de folhas são excluídas

O vencedor é a revisão de folha excluída no ramo de revisão mais longo

conflict resolution -case2

Caso 3: Algumas revisões de folhas são excluídas e outras não são excluídas

O vencedor é a revisão de folha não excluída no ramo de revisão mais longo

conflict resolution case3

Caso 4: Há um empate

O vencedor é aquele cuja ID de revisão é mais alta em uma comparação ASCII simples

conflict resolution - case 4

Resolução de conflitos

Quem deve lidar com os conflitos?

Embora o Couchbase Mobile escolha uma Revisão Atual entre as revisões conflitantes, em última análise, é responsabilidade do aplicativo resolver os conflitos pelos seguintes motivos

  • A escolha do vencedor entre as revisões conflitantes pode ser baseada em critérios diferentes daqueles que o sistema usa para escolher deterministicamente um vencedor. A revisão atual selecionada pelo Couchbase pode não ser a escolha certa para o aplicativo.
  • Não há um vencedor claro entre as resoluções conflitantes. Portanto, nesse caso, pode ser necessário mesclar alterações de revisões conflitantes. As especificidades de uma mesclagem dependem da semântica do aplicativo.
  • Mesmo que o aplicativo decida usar a revisão que o Couchbase escolheu como vencedora, lembre-se de que as revisões conflitantes ainda permanecem no banco de dados. Portanto, o aplicativo ainda deve excluir as revisões não vencedoras da árvore de revisão para evitar que a árvore de revisão fique muito grande com revisões conflitantes não utilizadas. Isso será discutido em profundidade em uma próxima postagem.

Opções para lidar com conflitos

Há duas opções para lidar com conflitos

Opção 1: Escolha uma revisão entre as revisões conflitantes

Nessa opção, uma das revisões conflitantes é considerada a vencedora e as demais são "tombadas".

O aplicativo pode manter a "Revisão atual" escolhida pelo Couchbase como a vencedora ou pode escolher uma revisão diferente entre as revisões conflitantes. Independentemente disso, é importante excluir os não vencedores para que eles possam ser eliminados durante a compactação do banco de dados, conforme discutido na próxima seção

conflict resolution with tombstone

Opção 2: N-way-merge

Nessa opção, as alterações de revisões conflitantes são mescladas de acordo com a semântica do aplicativo. As fusões vão para uma nova revisão que se torna a revisão atual/vencedora. O ramo não vencedor é tombado.

conflict resolution- n way merge

E se os conflitos não forem resolvidos?

Se um aplicativo decidir escolher o vencedor escolhido pelo Couchbase Mobile e não resolver explicitamente os conflitos, você pode acabar com uma árvore de revisão com um grande número de ramificações e nós de folhas. Isso terá consequências indesejáveis no tamanho do documento e, consequentemente, no tamanho do banco de dados. O Couchbase Mobile possui processos automáticos para aliviar parte desse problema, mas o aplicativo é o principal responsável por garantir que as revisões de folhas indesejadas sejam eliminadas.

Discutiremos os detalhes do gerenciamento do banco de dados e da árvore de revisão em um próximo post, portanto, fique atento.

E agora?

Este post foi uma introdução ao sistema de controle de simultaneidade no Couchbase Mobile. Uma consideração importante em um sistema baseado no MVCC é o gerenciamento do tamanho das árvores de revisão e a prevenção do seu inchaço. Esse aspecto será discutido em uma próxima publicação.

Se tiver dúvidas ou comentários, deixe um comentário abaixo ou entre em contato comigo pelo Twitter @rajagp ou envie-me um e-mail priya.rajagopal@couchbase.com. O Fóruns do Couchbase são outro bom lugar para entrar em contato com perguntas.

Por fim, um breve agradecimento a Traun Leyden e Sachin Smotra por suas contribuições para esta publicação.

 

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Priya Rajagopal, Diretora Sênior, Gerenciamento de Produtos

Priya Rajagopal é diretora sênior de gerenciamento de produtos da Couchbase, responsável pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente há mais de 20 anos em vários cargos técnicos e de liderança de produtos, com mais de 10 anos de foco em tecnologias móveis. Como delegada de padrões de IPTV da TISPAN, ela foi uma das principais colaboradoras das especificações de padrões de IPTV. Ela tem 22 patentes nas áreas de rede e segurança de plataforma.

3 Comentários

  1. [...] é a segunda parte de nossa série sobre Resolução de Conflitos no Couchbase Mobile. Em nossa primeira postagem, Desmistificando a resolução de conflitos, vimos os bastidores de como as revisões e os conflitos de documentos são tratados no Couchbase [...]

  2. A mesma coisa de "rev is required" se aplica à solicitação de atualização de documento (PUT), mas a API ainda não diz isso. Por quê?

  3. Você está se referindo a esta solicitação? https://developer.couchbase.com/documentation/mobile/1.4/references/sync-gateway/rest-api/index.html?v=1.5#/document/put__db___doc_

    Nesse caso, observe que o PUT é usado para criar e atualizar um documento. Portanto, rev é opcional se você estiver criando o documento

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.