{"id":3919,"date":"2017-08-09T10:00:54","date_gmt":"2017-08-09T17:00:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3919"},"modified":"2025-06-13T20:09:30","modified_gmt":"2025-06-14T03:09:30","slug":"data-replication-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/data-replication-couchbase-mobile\/","title":{"rendered":"Apresentando o novo protocolo de replica\u00e7\u00e3o de dados no Couchbase Mobile 2.0"},"content":{"rendered":"<p>Em um sistema distribu\u00eddo, as atualiza\u00e7\u00f5es em um banco de dados compartilhado de v\u00e1rios clientes ter\u00e3o de ser sincronizadas. O objetivo do processo de replica\u00e7\u00e3o \u00e9 garantir que todos os clientes m\u00f3veis e o(s) servidor(es) tenham uma vis\u00e3o consistente dos dados, sincronizando as altera\u00e7\u00f5es nos bancos de dados locais e remotos. No Couchbase Mobile, a replica\u00e7\u00e3o ocorre entre os clientes que executam o Couchbase Lite e o Sync Gateway do servidor.<\/p>\n<p>O Couchbase Mobile 2.0\u00a0<a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.0\/index.html\">libera\u00e7\u00e3o<\/a>\u00a0traz uma infinidade de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/announcing-couchbase-mobile-2-0-developer-preview\/\">Novos recursos e aprimoramentos<\/a>. Um aprimoramento importante \u00e9 o novo e aprimorado protocolo de replica\u00e7\u00e3o. Esta postagem apresentar\u00e1 a voc\u00ea os fundamentos do novo protocolo de replica\u00e7\u00e3o no Couchbase Mobile 2.0.<br \/>\nVoc\u00ea pode fazer o download do Couchbase Mobile 2.0 em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">aqui<\/a>.<\/p>\n<div>\n<div>Deve-se observar que o protocolo pode mudar com o tempo e n\u00e3o deve ser usado diretamente. O objetivo da postagem \u00e9 dar a voc\u00ea uma compreens\u00e3o ampla do protocolo para facilitar a depura\u00e7\u00e3o<\/div>\n<\/div>\n<p><!--more--><\/p>\n<h2 id=\"background\">Hist\u00f3rico<\/h2>\n<p>O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/\">Plataforma m\u00f3vel do Couchbase <\/a> compreende o <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.0\/index.html\">Couchbase Lite<\/a> Banco de dados incorporado NoSQL em execu\u00e7\u00e3o nos clientes; o <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/1.5\/index.html\">Gateway de sincroniza\u00e7\u00e3o<\/a> respons\u00e1vel pela sincroniza\u00e7\u00e3o de dados, roteamento de dados e autentica\u00e7\u00e3o\/autoriza\u00e7\u00e3o de usu\u00e1rios; e <a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/getting-started\/start-here.html\">Servidor Couchbase<\/a> para persist\u00eancia e gerenciamento de dados.<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/NoSQL_for_iOS_Platform.png\" alt=\"\" \/><\/p>\n<p>Na vers\u00e3o 1.x do Couchbase Mobile, a replica\u00e7\u00e3o foi implementada usando um protocolo baseado em REST <a href=\"https:\/\/en.wikipedia.org\/wiki\/Apache_CouchDB\">originado por CouchDB<\/a> por HTTP(s). De fato, a l\u00f3gica de replica\u00e7\u00e3o foi implementada como uma s\u00e9rie de chamadas de API por HTTP.<\/p>\n<h2 id=\"new-layered-architecture\">Nova arquitetura em camadas<\/h2>\n<p>O Replication Protocol 2.0 \u00e9 implementado como um novo <a href=\"https:\/\/github.com\/couchbaselabs\/BLIP-Cpp\/blob\/master\/docs\/BLIP%20Protocol.md\">protocolo de mensagens<\/a> em camadas <a href=\"https:\/\/en.wikipedia.org\/wiki\/WebSocket\">WebSockets<\/a>. Ele \u00e9 compat\u00edvel com todos os <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.0\/index.html\">suportado <\/a> Plataformas Couchbase Lite 2.0 e Sync Gateway 2.0.<\/p>\n<p>O protocolo WebSocket permite a passagem de mensagens full-duplex entre hosts remotos por meio de uma \u00fanica conex\u00e3o de soquete TCP. O protocolo WebSocket come\u00e7a como uma conex\u00e3o HTTP(s) e muda para Websockets se o host remoto for compat\u00edvel.<\/p>\n<p>O novo protocolo de mensagens, inventado por <a href=\"https:\/\/github.com\/snej\">Jens Alfke<\/a>A nova arquitetura em camadas \u00e9 mais limpa e permite a separa\u00e7\u00e3o de preocupa\u00e7\u00f5es entre a l\u00f3gica de replica\u00e7\u00e3o e o transporte de mensagens subjacente. A nova arquitetura em camadas \u00e9 mais limpa e permite uma separa\u00e7\u00e3o de preocupa\u00e7\u00f5es entre a l\u00f3gica de replica\u00e7\u00e3o e o transporte de mensagens subjacente. O novo protocolo \u00e9 mais r\u00e1pido e requer menos largura de banda e recursos de soquete. A economia de recursos de soquete permitiria maior suporte a conex\u00f5es simult\u00e2neas no servidor. Por fim, a natureza bidirecional do protocolo WebSocket se presta bem a configura\u00e7\u00f5es ponto a ponto.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/replication2.0.png\" alt=\"\" \/><\/p>\n<h2 id=\"enabling-the-2-0-replication-protocol\">Compatibilidade<\/h2>\n<p>O novo protocolo de replica\u00e7\u00e3o \u00e9 compat\u00edvel com os clientes Couchbase Lite 2.0 e Sync Gateway 2.0. Confira a <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.0\/compatibility-matrix.html\">guia de compatibilidade<\/a> para obter detalhes.<\/p>\n<p>Esse \u00e9 o protocolo de replica\u00e7\u00e3o padr\u00e3o que ser\u00e1 usado no Couchbase Mobile 2.0. Voc\u00ea n\u00e3o precisa ativ\u00e1-lo especificamente na configura\u00e7\u00e3o do Sync Gateway. No caso de clientes Couchbase Lite 1.x, o Sync Gateway mudar\u00e1 automaticamente para o protocolo de replica\u00e7\u00e3o mais antigo.<\/p>\n<h2 id=\"terminology\">Terminologia<\/h2>\n<p>Aqui est\u00e3o alguns termos que usaremos nesta discuss\u00e3o<\/p>\n<ul>\n<li><em>\"Cliente\"<\/em> : Cliente Couchbase Lite 2.0<\/li>\n<li><em>\"Servidor\"<\/em> : Sync Gateway 2.0<\/li>\n<li><em>\"Banco de dados de origem\"<\/em> : O banco de dados local a partir do qual as altera\u00e7\u00f5es s\u00e3o replicadas<\/li>\n<li><em>\"Banco de dados de destino\"<\/em> : O banco de dados remoto para o qual as altera\u00e7\u00f5es s\u00e3o replicadas<\/li>\n<li><em>\"Replicador de origem\"<\/em> : O replicador que est\u00e1 enviando altera\u00e7\u00f5es no banco de dados<\/li>\n<li><em>\"Replicador de Alvo\"<\/em> : O replicador que est\u00e1 recebendo altera\u00e7\u00f5es no banco de dados<\/li>\n<li><em>\"Replica\u00e7\u00e3o por push\"<\/em> : Processo pelo qual os clientes fazem upload das altera\u00e7\u00f5es do banco de dados de origem local para o banco de dados de destino remoto (servidor)<\/li>\n<li><em>\"Replica\u00e7\u00e3o pull\"<\/em> : Processo pelo qual os clientes fazem download das altera\u00e7\u00f5es do banco de dados de origem remota (servidor) para o banco de dados de destino local<\/li>\n<li><em>\"Replicador Ativo\"<\/em> : Replicador do Couchbase Lite que faz push ou pull automaticamente das altera\u00e7\u00f5es no banco de dados<\/li>\n<li><em>\"Replicador Passivo\"<\/em> : Replicador do Sync Gateway que responde a solicita\u00e7\u00f5es push ou pull de altera\u00e7\u00f5es<\/li>\n<\/ul>\n<h2 id=\"replication-modes\">Modos de replica\u00e7\u00e3o<\/h2>\n<p>O processo de replica\u00e7\u00e3o pode ser \"<em>cont\u00ednuo<\/em>\" ou \"<em>um tiro<\/em>&#8220;.<\/p>\n<ul>\n<li>No modo de replica\u00e7\u00e3o \"Cont\u00ednuo\", as altera\u00e7\u00f5es s\u00e3o continuamente sincronizadas entre o cliente e o Sync Gateway.<\/li>\n<li>No modo \"One shot\", as altera\u00e7\u00f5es s\u00e3o sincronizadas uma vez e a conex\u00e3o entre o cliente e o servidor \u00e9 desconectada. Quando qualquer altera\u00e7\u00e3o futura precisar ser enviada para cima ou para baixo, o cliente dever\u00e1 iniciar uma nova replica\u00e7\u00e3o.<\/li>\n<\/ul>\n<h2 id=\"concepts\">Conceitos<\/h2>\n<p>Antes de analisarmos o protocolo, precisamos entender alguns conceitos-chave.<\/p>\n<h3 id=\"revision-trees\">\u00c1rvores de revis\u00e3o<\/h3>\n<p>O Couchbase usa um sistema de controle de simultaneidade de v\u00e1rias vers\u00f5es (MVCC) para gerenciar documentos. Nesse sistema, cada documento no Couchbase Mobile \u00e9 armazenado como uma sequ\u00eancia de revis\u00f5es. Uma nova revis\u00e3o \u00e9 criada automaticamente quando um documento \u00e9 criado. Cada atualiza\u00e7\u00e3o do documento, seja uma edi\u00e7\u00e3o ou uma exclus\u00e3o, resultar\u00e1 na cria\u00e7\u00e3o de uma nova revis\u00e3o para o documento. A revis\u00e3o especial que marca uma exclus\u00e3o \u00e9 chamada de <em>l\u00e1pide<\/em> revis\u00e3o. A <em>revis\u00e3o atual<\/em> \u00e9 a revis\u00e3o da folha do documento e, no caso de revis\u00f5es conflitantes, corresponde \u00e0 <em>vencedor<\/em> revis\u00e3o. Para obter mais detalhes sobre \u00e1rvores de revis\u00e3o e resolu\u00e7\u00e3o de conflitos na vers\u00e3o 2.0, fique atento a uma pr\u00f3xima postagem do blog sobre esse t\u00f3pico.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/revision-tree.png\" alt=\"\" \/><\/p>\n<h3 id=\"change\">Mudan\u00e7a<\/h3>\n<p>A revis\u00e3o atual que existe no banco de dados de origem, mas n\u00e3o no banco de dados de destino, \u00e9 chamada de <em>mudan\u00e7a<\/em>. Assim, efetivamente, o processo de replica\u00e7\u00e3o <em>sincroniza as altera\u00e7\u00f5es<\/em> entre bancos de dados remotos.<\/p>\n<h3 id=\"sequence-id\">ID da sequ\u00eancia<\/h3>\n<p>Cada altera\u00e7\u00e3o est\u00e1 associada a um \u00fanico <em>ID da sequ\u00eancia<\/em> que est\u00e1 em ordem cronol\u00f3gica crescente. \u00c9 semelhante a um carimbo de data\/hora da \u00faltima modifica\u00e7\u00e3o, exceto pelo fato de n\u00e3o ser uma hora de rel\u00f3gio de parede, mas um contador que aumenta automaticamente. Os IDs de sequ\u00eancia s\u00e3o espec\u00edficos de um determinado banco de dados, portanto, quando um documento \u00e9 replicado, ele n\u00e3o termina com o mesmo ID de sequ\u00eancia.<\/p>\n<p><strong>Observa\u00e7\u00e3o:<\/strong> Enquanto os IDs de sequ\u00eancia do Couchbase Lite s\u00e3o n\u00fameros inteiros simples, os do Sync Gateway podem ser cadeias longas de base64. Os motivos s\u00e3o complexos e t\u00eam a ver com a concorr\u00eancia interna entre os n\u00f3s em um cluster do Couchbase Server. O conte\u00fado exato de um ID de sequ\u00eancia remota depende da implementa\u00e7\u00e3o e um cliente nunca deve fazer suposi\u00e7\u00f5es sobre ele.<\/p>\n<h3 id=\"checkpoint\">Ponto de controle<\/h3>\n<p>O ponto de verifica\u00e7\u00e3o \u00e9 um registro do \u00faltimo <em>ID da sequ\u00eancia<\/em> replicado pelo replicador. No final de cada ciclo de replica\u00e7\u00e3o, o replicador far\u00e1 o checkpoint da fonte <em>ID da sequ\u00eancia<\/em> correspondente \u00e0 \u00faltima altera\u00e7\u00e3o enviada ao destino. O primeiro ciclo de replica\u00e7\u00e3o n\u00e3o ter\u00e1 pontos de verifica\u00e7\u00e3o.<\/p>\n<h2 id=\"what-does-replication-really-do-\">O que a replica\u00e7\u00e3o realmente faz?<\/h2>\n<p>Agora que voc\u00ea j\u00e1 entendeu os principais conceitos, a replica\u00e7\u00e3o pode ser descrita como o processo pelo qual o replicador de origem envia todos os arquivos de dados de um replicador. <em>mudan\u00e7as<\/em>cujos IDs de sequ\u00eancia s\u00e3o maiores do que o \u00faltimo ponto de verifica\u00e7\u00e3o, para o replicador de destino. Os corpos de revis\u00e3o do <em>atual<\/em> revis\u00f5es, juntamente com as <em>bolhas<\/em>\/anexos e o hist\u00f3rico de revis\u00e3o s\u00e3o replicados.<\/p>\n<p><strong>Observa\u00e7\u00e3o<\/strong>: \u00c9 poss\u00edvel que o mesmo documento seja editado simultaneamente no banco de dados de origem e de destino, resultando em um conflito. Discutiremos conflitos e replica\u00e7\u00e3o um pouco mais adiante nesta postagem.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/replication_video.gif\" alt=\"\" \/><br \/>\nObserve que, se um documento for <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/current\/managing-tombstones.html#lbl-tomb-purge\">purgado<\/a> do banco de dados, o expurgo n\u00e3o ser\u00e1 replicado. A elimina\u00e7\u00e3o remove todos os rastros do documento do banco de dados.<\/p>\n<h2 id=\"the-url\">O esquema de URL<\/h2>\n<p>Couchbase Lite clients must use the `ws` URL scheme to connect to the Sync Gateway<\/p>\n<p>Aqui est\u00e3o alguns exemplos<\/p>\n<pre><code> \r\n\tws:\/\/sync-gw-address:4984\r\n       wss:\/\/sync-gw-address:4984\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2 id=\"the-protocol\">O protocolo<\/h2>\n<h3 id=\"connection-establishment\">Estabelecimento de conex\u00e3o<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/handshake_websocket.png\" alt=\"\" \/><\/p>\n<ol>\n<li>Quando a replica\u00e7\u00e3o \u00e9 iniciada, o cliente envia uma solicita\u00e7\u00e3o de handshake do WebSocket para o servidor por HTTP(s), indicando que deseja mudar para o WebSocket. Essa \u00e9 uma solicita\u00e7\u00e3o HTTP GET, com cabe\u00e7alhos especiais, para o recurso <code>_blipsync<\/code> relativo ao URL do banco de dados.<\/li>\n<li>O servidor responde indicando que concorda com a troca de protocolo.<\/li>\n<li>Uma vez que o <em>Handshake de Websockets<\/em> \u00e9 feito, o soquete deixa de ser usado para HTTP e todas as comunica\u00e7\u00f5es posteriores s\u00e3o mensagens WebSocket.<\/li>\n<\/ol>\n<p>Um \u00fanico soquete pode suportar simultaneamente uma replica\u00e7\u00e3o push e pull. Ambos os tipos armazenam e recuperam pontos de controle e exigem esses pontos de controle para prosseguir, portanto, o gerenciamento de pontos de controle ser\u00e1 descrito primeiro.<\/p>\n<h3 id=\"checkpoint-management\">Gerenciamento de pontos de controle<\/h3>\n<p>As replica\u00e7\u00f5es push e pull armazenam e buscam pontos de controle no servidor.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/checkpoint-management.png\" alt=\"\" \/><\/p>\n<ol>\n<li>Ap\u00f3s o estabelecimento da conex\u00e3o, o cliente envia um <code>getCheckpoint<\/code> mensagem para o servidor a fim de determinar a \u00faltima ID de sequ\u00eancia de origem conhecida no servidor. A solicita\u00e7\u00e3o inclui:\n<ul>\n<li><em>ID do cliente<\/em> que identifica o cliente<\/li>\n<\/ul>\n<\/li>\n<li>A resposta a <code>getCheckpoint<\/code> inclui o \u00faltimo ponto de verifica\u00e7\u00e3o registrado para o cliente. O ponto de controle \u00e9 um objeto JSON criado e armazenado anteriormente pelo cliente; ele pode conter quaisquer dados que o cliente desejar, mas \u00e9 <em>atualmente<\/em> do formul\u00e1rio:\n<ul>\n<li><em>ID de sequ\u00eancia local<\/em> que \u00e9 a \u00faltima sequ\u00eancia conhecida enviada pelo cliente<\/li>\n<li><em>ID de sequ\u00eancia remota<\/em> que \u00e9 a \u00faltima ID de sequ\u00eancia recebida pelo cliente<\/li>\n<\/ul>\n<\/li>\n<li>\u00c0 medida que as sequ\u00eancias s\u00e3o replicadas com sucesso, o cliente envia periodicamente um <code>setCheckpoint<\/code> para registrar a \u00faltima ID de sequ\u00eancia local que foi enviada e\/ou a \u00faltima ID de sequ\u00eancia remota que foi recebida.<\/li>\n<\/ol>\n<h3 id=\"push-replication\">Replica\u00e7\u00e3o por push<\/h3>\n<p>Durante a replica\u00e7\u00e3o push, uma s\u00e9rie de altera\u00e7\u00f5es \u00e9 enviada automaticamente pelo <em>replicador ativo<\/em> para o <em>replicador passivo<\/em><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/push_replication_2-2.png\" alt=\"\" \/><\/p>\n<ol>\n<li>Depois que o ponto de verifica\u00e7\u00e3o for recuperado, e quando o replicador do lado do cliente detectar altera\u00e7\u00f5es em seu banco de dados local desde o <em>ID de sequ\u00eancia local<\/em>o cliente envia um <code>proposeChanges<\/code> para o servidor com uma matriz de <code>mudan\u00e7a<\/code> correspondentes a cada revis\u00e3o atual que foi alterada. Isso inclui revis\u00f5es com t\u00famulos. A altera\u00e7\u00e3o em si \u00e9 codificada como uma matriz JSON aninhada e inclui:\n<ul>\n<li><em>ID do documento<\/em> do documento associado \u00e0 altera\u00e7\u00e3o<\/li>\n<li><em>ID da revis\u00e3o<\/em> da revis\u00e3o atual do documento<\/li>\n<li><em>ID de revis\u00e3o do servidor<\/em> de revis\u00e3o de servidor conhecida, se houver. \u00c9 omitido se n\u00e3o houver nenhuma <em>ID de revis\u00e3o do servidor<\/em><\/li>\n<li>Opcionalmente, o tamanho aproximado do corpo do documento<\/li>\n<\/ul>\n<\/li>\n<li>A resposta do servidor \u00e0 mensagem <code>proposeChanges<\/code> A solicita\u00e7\u00e3o inclui um objeto JSON que cont\u00e9m:\n<ul>\n<li>uma matriz de c\u00f3digos de status, com cada entrada correspondendo \u00e0 ID de revis\u00e3o especificada no <code>proposeChanges<\/code> solicita\u00e7\u00e3o.\n<ul>\n<li>Um valor de 0 indica que o servidor est\u00e1 interessado na rev<\/li>\n<li>Um valor de 304 indica que o servidor tem essa revis\u00e3o<\/li>\n<li>Um valor de 409 indica que as altera\u00e7\u00f5es causariam um conflito<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>O cliente envia um <code>rev<\/code> mensagem <em>para cada uma das revis\u00f5es<\/em> solicitado na <code>proposeChanges<\/code> resposta na etapa 2. O <code>rev<\/code> O corpo da mensagem cont\u00e9m o documento no formato JSON, e os cabe\u00e7alhos da mensagem cont\u00eam metadados:\n<ul>\n<li><code>id<\/code> campo cujo valor \u00e9 o ID do documento cujo corpo est\u00e1 inclu\u00eddo<\/li>\n<li><code>rev<\/code> campo com valor correspondente \u00e0 revis\u00e3o inclu\u00edda<\/li>\n<li><code>sequ\u00eancia<\/code> com a ID de sequ\u00eancia da altera\u00e7\u00e3o<\/li>\n<li><code>hist\u00f3rico<\/code> que inclui uma lista separada por v\u00edrgulas de IDs de revis\u00e3o desde o <em>revis\u00e3o de ancestrais conhecidos<\/em> conforme especificado no <code>mudan\u00e7as<\/code> resposta<\/li>\n<\/ul>\n<\/li>\n<li>Depois de todos os <code>rev<\/code> mensagens foram enviadas, em <em>cont\u00ednuo<\/em> o cliente aguarda a altera\u00e7\u00e3o do banco de dados local e retorna \u00e0 Etapa 1. Em <em>um tiro<\/em> a conex\u00e3o \u00e9 desconectada e a replica\u00e7\u00e3o termina.<\/li>\n<\/ol>\n<h3 id=\"pull-replication\">Replica\u00e7\u00e3o pull<\/h3>\n<p>Durante a replica\u00e7\u00e3o pull, uma s\u00e9rie de altera\u00e7\u00f5es \u00e9 enviada pelo servidor <em>replicador passivo<\/em> em resposta a uma solicita\u00e7\u00e3o pull do cliente <em>replicador ativo<\/em>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/pull-replication.png\" alt=\"\" \/><\/p>\n<ol>\n<li>Depois que o ponto de verifica\u00e7\u00e3o \u00e9 recuperado, o cliente envia um <code>subaltera\u00e7\u00f5es<\/code> mensagem para o servidor que inclui cabe\u00e7alhos:\n<ul>\n<li><code>desde<\/code> com o valor do campo <em>ID de sequ\u00eancia remota<\/em><\/li>\n<li><code>cont\u00ednuo<\/code> para indicar se est\u00e1 no modo cont\u00ednuo. Um valor de <code>verdadeiro<\/code> indica que o cliente deseja ser notificado continuamente sobre as altera\u00e7\u00f5es.<\/li>\n<li><code>lote<\/code> campo com valor que indica o n\u00famero m\u00e1ximo de altera\u00e7\u00f5es a serem enviadas em uma \u00fanica mensagem<\/li>\n<\/ul>\n<\/li>\n<li>O servidor envia um <code>mudan\u00e7as<\/code> para o cliente com uma matriz de <code>mudan\u00e7a<\/code> correspondentes a cada revis\u00e3o atual que foi alterada. Isso inclui revis\u00f5es com t\u00famulos. A altera\u00e7\u00e3o em si \u00e9 codificada como uma matriz JSON aninhada e inclui:\n<ul>\n<li><em>ID de sequ\u00eancia remota<\/em> que \u00e9 a ID de sequ\u00eancia da altera\u00e7\u00e3o no lado do servidor<\/li>\n<li><em>ID do documento<\/em> do documento associado \u00e0 altera\u00e7\u00e3o<\/li>\n<li><em>ID da revis\u00e3o<\/em> da revis\u00e3o atual do documento<\/li>\n<li><em>isDeleted<\/em> para indicar se a revis\u00e3o \u00e9 um tombstone ou n\u00e3o. Um valor de 1 indica que se trata de uma revis\u00e3o de tombstone<\/li>\n<li>Opcionalmente, o tamanho aproximado do corpo do documento<\/li>\n<\/ul>\n<\/li>\n<li>A resposta do cliente ao <code>mudan\u00e7as<\/code> A solicita\u00e7\u00e3o inclui um objeto JSON que cont\u00e9m:\n<ul>\n<li><code>maxHistory<\/code> campo cujo valor \u00e9 o tamanho m\u00e1ximo do hist\u00f3rico que o cliente aceitar\u00e1<\/li>\n<li>uma matriz de <em>ancestrais conhecidos<\/em>uma entrada para cada ID de revis\u00e3o especificada no <code>mudan\u00e7as<\/code> solicita\u00e7\u00e3o. Um valor nulo para uma entrada indica que o cliente n\u00e3o est\u00e1 interessado na revis\u00e3o correspondente.<\/li>\n<\/ul>\n<\/li>\n<li>O servidor envia um <code>rev<\/code> mensagem <em>para cada uma das revis\u00f5es<\/em> solicitado na <code>mudan\u00e7as<\/code> resposta na etapa 3. O <code>rev<\/code> O corpo da mensagem cont\u00e9m o documento no formato JSON, e os cabe\u00e7alhos da mensagem cont\u00eam metadados:\n<ul>\n<li><code>id<\/code> campo cujo valor corresponde ao ID do documento cujo corpo est\u00e1 inclu\u00eddo<\/li>\n<li><code>rev<\/code> campo com valor correspondente \u00e0 revis\u00e3o inclu\u00edda<\/li>\n<li><code>sequ\u00eancia<\/code> com o valor correspondente \u00e0 ID de sequ\u00eancia da altera\u00e7\u00e3o<\/li>\n<li><code>hist\u00f3rico<\/code> que inclui uma lista separada por v\u00edrgulas de IDs de revis\u00e3o desde o <em>revis\u00e3o de ancestrais conhecidos<\/em> conforme especificado em <code>mudan\u00e7as<\/code> resposta<\/li>\n<\/ul>\n<\/li>\n<li>Quando terminar de enviar as altera\u00e7\u00f5es, o servidor enviar\u00e1 uma mensagem vazia <code>mudan\u00e7as<\/code> para indicar que n\u00e3o h\u00e1 mais altera\u00e7\u00f5es a serem enviadas.<\/li>\n<li>Depois que todas as altera\u00e7\u00f5es tiverem sido enviadas, em <em>cont\u00ednuo<\/em> a conex\u00e3o permanece aberta enquanto o servidor aguarda a altera\u00e7\u00e3o do banco de dados e, em seguida, retorna \u00e0 Etapa 2. Em <em>um tiro<\/em> a conex\u00e3o \u00e9 desconectada e a replica\u00e7\u00e3o termina.<\/li>\n<\/ol>\n<p><strong>Observa\u00e7\u00e3o<\/strong> que as etapas 2 a 4 s\u00e3o id\u00eanticas \u00e0s etapas 1 a 3 da replica\u00e7\u00e3o por push, apenas com as fun\u00e7\u00f5es \"cliente\" e \"servidor\" trocadas. O protocolo de replica\u00e7\u00e3o \u00e9 bastante sim\u00e9trico, ao contr\u00e1rio de uma API baseada em HTTP, em que as fun\u00e7\u00f5es de cliente e servidor exigem c\u00f3digos totalmente diferentes. Isso ajuda a simplificar o projeto e a implementa\u00e7\u00e3o, especialmente para a replica\u00e7\u00e3o ponto a ponto entre clientes.<\/p>\n<h2 id=\"handling-conflicts\">Como lidar com conflitos<\/h2>\n<p>Os conflitos ocorrem quando h\u00e1 <em>concomitante<\/em> atualiza\u00e7\u00f5es para o <em>mesmo<\/em> revis\u00e3o de documentos de v\u00e1rias fontes. Aqui, \"simult\u00e2neo\" significa \"entre replica\u00e7\u00f5es\": se um cliente ficar off-line por uma hora e voltar, todas as altera\u00e7\u00f5es feitas nesse cliente <em>durante essa hora<\/em> seria efetivamente simult\u00e2neo \u00e0s altera\u00e7\u00f5es feitas por todos os outros clientes. Em um sistema distribu\u00eddo como esse, a simultaneidade n\u00e3o \u00e9 uma condi\u00e7\u00e3o de corrida rara, mas um fato da vida.<\/p>\n<p>O Couchbase Mobile 2.0 oferece suporte a um novo <em>livre de conflitos<\/em> modo. Os detalhes de como os conflitos s\u00e3o tratados na vers\u00e3o 2.0 est\u00e3o fora do escopo desta postagem do blog, mas voc\u00ea pode ler mais sobre isso <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/1.5\/resolving-conflicts.html\">aqui<\/a>. Em um alto n\u00edvel, quando o cliente encontra um conflito ao salvar uma revis\u00e3o, o retorno de chamada do resolvedor de conflitos associado ao documento \u00e9 chamado e a revis\u00e3o mesclada resultante \u00e9 usada. Assim, o documento nunca existe visivelmente em um estado conflituoso. Voc\u00ea pode ler mais sobre isso em uma pr\u00f3xima postagem do blog.<\/p>\n<h2 id=\"loss-of-connection-to-server\">Perda de conex\u00e3o com o servidor<\/h2>\n<p>Durante a replica\u00e7\u00e3o, se o cliente n\u00e3o conseguir se conectar ao servidor ou se a conex\u00e3o com o servidor for perdida, o cliente tentar\u00e1 se reconectar usando um algoritmo de backoff exponencial, no qual ele espera cada vez mais tempo a cada nova tentativa.<\/p>\n<ul>\n<li>No caso de um <em>um tiro<\/em> replica\u00e7\u00e3o, ser\u00e3o feitas no m\u00e1ximo duas tentativas de repeti\u00e7\u00e3o antes que o cliente desista.<\/li>\n<li>No caso de <em>replica\u00e7\u00e3o cont\u00ednua<\/em>o cliente tentar\u00e1 se reconectar indefinidamente, mas o intervalo de tentativas n\u00e3o aumentar\u00e1 al\u00e9m de 10 minutos.<\/li>\n<\/ul>\n<p>O replicador cancelar\u00e1 seu cron\u00f4metro e tentar\u00e1 novamente de imediato se for notificado de que a conex\u00e3o de rede do dispositivo foi alterada (ele se conectou a uma rede WiFi ou celular). Por\u00e9m, devido \u00e0 forma como a rede IP funciona, o dispositivo s\u00f3 pode detectar altera\u00e7\u00f5es em suas pr\u00f3prias interfaces de rede, e n\u00e3o altera\u00e7\u00f5es que estejam ocorrendo em outros lugares no caminho para o servidor, nem mesmo no roteador WiFi local. Portanto, conectar o cabo ou a conex\u00e3o Ethernet novamente ao roteador <em>n\u00e3o<\/em> ser\u00e1 detectado imediatamente. No entanto, o desligamento do roteador ser\u00e1 detectado, pois a interface de rede WiFi do dispositivo ficar\u00e1 inativa.<\/p>\n<p>A detec\u00e7\u00e3o de uma conex\u00e3o perdida tamb\u00e9m pode ser problem\u00e1tica. Quando uma conex\u00e3o TCP est\u00e1 ociosa, nenhum pacote est\u00e1 sendo enviado em nenhuma dire\u00e7\u00e3o, portanto, nenhum dos pares pode saber se o outro foi desconectado abruptamente ou se uma conex\u00e3o ao longo do caminho entre eles foi cortada (por exemplo, se o cabo ou a Ethernet do roteador foi desconectado). Se o remetente n\u00e3o receber um pacote TCP ACK em resposta \u00e0 sua mensagem dentro de alguns segundos, ele saber\u00e1 que a conex\u00e3o caiu.<\/p>\n<h2 id=\"what-next\">O que vem a seguir<\/h2>\n<p>A arquitetura de replica\u00e7\u00e3o 2.0 no Couchbase Mobile 2.0 \u00e9 mais limpa, mais simples e mais eficiente em termos de recursos do que as vers\u00f5es anteriores baseadas em REST API\/HTTP.<\/p>\n<p>Se tiver d\u00favidas ou coment\u00e1rios, deixe um coment\u00e1rio abaixo ou sinta-se \u00e0 vontade para entrar em contato comigo pelo Twitter @rajagp ou por e-mail <a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>. O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">F\u00f3runs do Couchbase<\/a> s\u00e3o outro bom lugar para entrar em contato com perguntas.<br \/>\nPor fim, um agradecimento especial a Jens Alfke (<a href=\"https:\/\/github.com\/snej\">https:\/\/github.com\/snej<\/a>), por seu feedback.<\/p>","protected":false},"excerpt":{"rendered":"<p>In a distributed system, updates to a shared database from multiple clients will have to be synchronized. The goal of the replication process is to ensure that all the mobile clients and the server(s) have a consistent view of the [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1821,7667,1810,2366],"tags":[2034,2004,1562,1782],"ppma_author":[8948],"class_list":["post-3919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-architecture","category-couchbase-lite","category-couchbase-mobile","category-sync-gateway","tag-blip","tag-couchbase-mobile-2-0","tag-replication","tag-websocket"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Data Replication 2.0<\/title>\n<meta name=\"description\" content=\"The goal of data replication process is to ensure that all the mobile clients and the server(s) have a consistent view of the data by synchronizing changes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/data-replication-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the New Data Replication Protocol in Couchbase Mobile 2.0\" \/>\n<meta property=\"og:description\" content=\"The goal of data replication process is to ensure that all the mobile clients and the server(s) have a consistent view of the data by synchronizing changes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/data-replication-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-09T17:00:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:09:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/NoSQL_for_iOS_Platform.png\" \/>\n<meta name=\"author\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rajagp\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Introducing the New Data Replication Protocol in Couchbase Mobile 2.0\",\"datePublished\":\"2017-08-09T17:00:54+00:00\",\"dateModified\":\"2025-06-14T03:09:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/\"},\"wordCount\":2612,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"BLIP\",\"couchbase mobile 2.0\",\"replication\",\"websocket\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Couchbase Lite\",\"Couchbase Mobile\",\"Sync Gateway\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/\",\"name\":\"Data Replication 2.0\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-08-09T17:00:54+00:00\",\"dateModified\":\"2025-06-14T03:09:30+00:00\",\"description\":\"The goal of data replication process is to ensure that all the mobile clients and the server(s) have a consistent view of the data by synchronizing changes.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the New Data Replication Protocol in Couchbase Mobile 2.0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\",\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"caption\":\"Priya Rajagopal, Senior Director, Product Management\"},\"description\":\"Priya Rajagopal is a Senior Director of Product Management at Couchbase responsible for developer platforms for the cloud and the edge. She has been professionally developing software for over 20 years in several technical and product leadership positions, with 10+ years focused on mobile technologies. As a TISPAN IPTV standards delegate, she was a key contributor to the IPTV standards specifications. She has 22 patents in the areas of networking and platform security.\",\"sameAs\":[\"https:\/\/x.com\/rajagp\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Data Replication 2.0","description":"O objetivo do processo de replica\u00e7\u00e3o de dados \u00e9 garantir que todos os clientes m\u00f3veis e o(s) servidor(es) tenham uma vis\u00e3o consistente dos dados por meio da sincroniza\u00e7\u00e3o das altera\u00e7\u00f5es.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/data-replication-couchbase-mobile\/","og_locale":"pt_BR","og_type":"article","og_title":"Introducing the New Data Replication Protocol in Couchbase Mobile 2.0","og_description":"The goal of data replication process is to ensure that all the mobile clients and the server(s) have a consistent view of the data by synchronizing changes.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/data-replication-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-08-09T17:00:54+00:00","article_modified_time":"2025-06-14T03:09:30+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/NoSQL_for_iOS_Platform.png","type":"","width":"","height":""}],"author":"Priya Rajagopal, Senior Director, Product Management","twitter_card":"summary_large_image","twitter_creator":"@rajagp","twitter_misc":{"Written by":"Priya Rajagopal, Senior Director, Product Management","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Introducing the New Data Replication Protocol in Couchbase Mobile 2.0","datePublished":"2017-08-09T17:00:54+00:00","dateModified":"2025-06-14T03:09:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/"},"wordCount":2612,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["BLIP","couchbase mobile 2.0","replication","websocket"],"articleSection":["Best Practices and Tutorials","Couchbase Architecture","Couchbase Lite","Couchbase Mobile","Sync Gateway"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/","name":"Data Replication 2.0","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-08-09T17:00:54+00:00","dateModified":"2025-06-14T03:09:30+00:00","description":"O objetivo do processo de replica\u00e7\u00e3o de dados \u00e9 garantir que todos os clientes m\u00f3veis e o(s) servidor(es) tenham uma vis\u00e3o consistente dos dados por meio da sincroniza\u00e7\u00e3o das altera\u00e7\u00f5es.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/data-replication-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing the New Data Replication Protocol in Couchbase Mobile 2.0"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c","name":"Priya Rajagopal, Diretora S\u00eanior, Gerenciamento de Produtos","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734","url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","caption":"Priya Rajagopal, Senior Director, Product Management"},"description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/"}]}},"authors":[{"term_id":8948,"user_id":1423,"is_guest":0,"slug":"priya-rajagopalcouchbase-com","display_name":"Priya Rajagopal, Senior Director, Product Management","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","author_category":"","last_name":"Rajagopal, Senior Director, Product Management","first_name":"Priya","job_title":"","user_url":"","description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=3919"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3919\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=3919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=3919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=3919"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=3919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}