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

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.

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.

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

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

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

Caso 4: Há um empate
O vencedor é aquele cuja ID de revisão é mais alta em uma comparação ASCII simples

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

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.

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.

[...] é 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 [...]
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ê?
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