{"id":2384,"date":"2016-09-11T06:43:09","date_gmt":"2016-09-11T06:43:09","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2384"},"modified":"2023-07-24T01:08:46","modified_gmt":"2023-07-24T08:08:46","slug":"sync-gateway-inter-instance-replication-code-sample","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/sync-gateway-inter-instance-replication-code-sample\/","title":{"rendered":"Exemplo de c\u00f3digo entre inst\u00e2ncias do Sync Gateway"},"content":{"rendered":"<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Neste\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/new-couchbase-mobile-v1.3-inter-instance-replication-sync-gateway\/\">postagem<\/a>Na se\u00e7\u00e3o \"Replica\u00e7\u00f5es\", entrei em detalhes sobre as replica\u00e7\u00f5es entre\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/get-started\/sync-gateway-overview\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Gateway de sincroniza\u00e7\u00e3o<\/a>\u00a0(SG) inst\u00e2ncias em\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Mobile<\/a>\u00a0(CBM). Escrevi um aplicativo Java simples com uma interface de usu\u00e1rio baseada em Swing para ilustrar um exemplo de trabalho. Executei o aplicativo junto com duas inst\u00e2ncias do SG para demonstrar tudo.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Esse diagrama mostra o fluxo no aplicativo e as comunica\u00e7\u00f5es com o par SG.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\"><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/september\/sync-gateway-inter-instance-replication-code-sample\/sg-replicate.png\" alt=\"Data flow diagram\" align=\"middle\" \/><\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Um painel de edi\u00e7\u00e3o nos permite inserir dados JSON. Esses dados s\u00e3o salvos na pasta\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Lite<\/a>\u00a0(CBL). Temos duas r\u00e9plicas configuradas. Uma delas envia os dados do banco de dados CBL para a inst\u00e2ncia do Sync Gateway que chamei de inst\u00e2ncia prim\u00e1ria. Vou me referir a ela simplesmente como Prim\u00e1ria. A prim\u00e1ria replica a si mesma para a inst\u00e2ncia SG de backup (doravante denominada Backup).<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para ver isso acontecer, monitoro o\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/develop\/references\/sync-gateway\/rest-api\/index.html#operation---db--_changes-get?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">_altera o feed<\/a>\u00a0do prim\u00e1rio e do backup.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Tudo funciona em conjunto no meu Mac. Voc\u00ea pode configurar uma pilha completa de CBM, tudo em execu\u00e7\u00e3o em sua m\u00e1quina de desenvolvimento. Isso facilita o desenvolvimento inicial. Tamb\u00e9m ajuda a entender como todas as pe\u00e7as se encaixam e funcionam. Falarei mais sobre isso em meu blog no futuro.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Vamos examinar as configura\u00e7\u00f5es e o c\u00f3digo.<\/p>\n<h2 id=\"configuring-sync-gateway\" style=\"color: #000000;font-family: sans-serif;line-height: 25.6px;text-align: start\">Configura\u00e7\u00e3o do Sync Gateway<\/h2>\n<h4 id=\"backup\" style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Backup<\/h4>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Executo cada inst\u00e2ncia do SG com seu pr\u00f3prio arquivo de configura\u00e7\u00e3o JSON. A configura\u00e7\u00e3o do Backup \u00e9 um pouco mais simples. Aqui est\u00e1 ela.<\/p>\n<pre style=\"overflow: auto;font-size: medium;color: #000000;line-height: 25.6px;text-align: start\"><code class=\"language-JSON hljs\" style=\"padding: 0.5em;color: #444444;background: #f0f0f0\">{\r\n  \"<span class=\"hljs-attr\">interface<\/span>\":<span class=\"hljs-string\" style=\"color: #880000\">\":5984\"<\/span>,\r\n  \"<span class=\"hljs-attr\">adminInterface<\/span>\":<span class=\"hljs-string\" style=\"color: #880000\">\":5985\"<\/span>,\r\n\r\n  \"<span class=\"hljs-attr\">registro<\/span>\": [<span class=\"hljs-string\" style=\"color: #880000\">\"*\"<\/span>],\r\n  \"<span class=\"hljs-attr\">bancos de dados<\/span>\": {\r\n    \"<span class=\"hljs-attr\">db<\/span>\": {\r\n      \"<span class=\"hljs-attr\">servidor<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"walrus:\"<\/span>,\r\n      \"<span class=\"hljs-attr\">usu\u00e1rios<\/span>\": { \"<span class=\"hljs-attr\">CONVIDADO<\/span>\": {\"<span class=\"hljs-attr\">desativado<\/span>\": <span class=\"hljs-literal\" style=\"color: #1f811f\">falso<\/span>, \"<span class=\"hljs-attr\">admin_channels<\/span>\": [<span class=\"hljs-string\" style=\"color: #880000\">\"*\"<\/span>] } }\r\n    }\r\n  }\r\n}\r\n<\/code><\/pre>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Como executamos duas c\u00f3pias do SG, precisamos nos certificar de que elas usem portas de rede diferentes. Por padr\u00e3o, o SG usa as portas 4984 e 4985. As primeiras linhas do Backup o configuram para escutar nas portas 5984 e 5985. N\u00e3o h\u00e1 nada de especial nessas portas. Apenas certifique-se de escolher aquelas que n\u00e3o s\u00e3o usadas por outros aplicativos em seu computador.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">O restante do arquivo de configura\u00e7\u00e3o faz com que o SG registre tudo, configura-se para servir dados de um banco de dados na mem\u00f3ria para fins especiais (indicado pela palavra-chave \"walrus\") e permite acesso aberto a qualquer pessoa por meio do usu\u00e1rio \"GUEST\". Essa \u00e9 uma boa parte a ser lembrada no in\u00edcio do desenvolvimento. O Walrus permite que voc\u00ea use o SG de forma aut\u00f4noma, sem um backend de servidor. Usar o GUEST com todo o acesso significa que voc\u00ea pode colocar as coisas em funcionamento sem se preocupar com a autentica\u00e7\u00e3o e a configura\u00e7\u00e3o de canais. Observe que, por padr\u00e3o, o SG registra os logs no stderr. \u00c9 poss\u00edvel adicionar uma op\u00e7\u00e3o para que ele registre em um arquivo.<\/p>\n<h4 id=\"primary-and-inter-instance-replication\" style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Replica\u00e7\u00e3o prim\u00e1ria e entre inst\u00e2ncias<\/h4>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Definimos a replica\u00e7\u00e3o por push na configura\u00e7\u00e3o do Primary. Ela tem alguns dos mesmos par\u00e2metros padr\u00e3o.<\/p>\n<pre style=\"overflow: auto;font-size: medium;color: #000000;line-height: 25.6px;text-align: start\"><code class=\"language-JSON hljs\" style=\"padding: 0.5em;color: #444444;background: #f0f0f0\">{\r\n  \"<span class=\"hljs-attr\">registro<\/span>\": [<span class=\"hljs-string\" style=\"color: #880000\">\"*\"<\/span>],\r\n  \"<span class=\"hljs-attr\">bancos de dados<\/span>\": {\r\n    \"<span class=\"hljs-attr\">db<\/span>\": {\r\n      \"<span class=\"hljs-attr\">servidor<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"walrus:\"<\/span>,\r\n      \"<span class=\"hljs-attr\">usu\u00e1rios<\/span>\": { \"<span class=\"hljs-attr\">CONVIDADO<\/span>\": {\"<span class=\"hljs-attr\">desativado<\/span>\": <span class=\"hljs-literal\" style=\"color: #1f811f\">falso<\/span>, \"<span class=\"hljs-attr\">admin_channels<\/span>\": [<span class=\"hljs-string\" style=\"color: #880000\">\"*\"<\/span>] } }\r\n    }\r\n  },\r\n\r\n  \"<span class=\"hljs-attr\">replica\u00e7\u00f5es<\/span>\":[\r\n    {\r\n      \"<span class=\"hljs-attr\">fonte<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"db\"<\/span>,\r\n      \"<span class=\"hljs-attr\">alvo<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"https:\/\/localhost:5985\/db\"<\/span>,\r\n      \"<span class=\"hljs-attr\">cont\u00ednuo<\/span>\": <span class=\"hljs-literal\" style=\"color: #1f811f\">verdadeiro<\/span>\r\n    }\r\n  ]\r\n}\r\n<\/code><\/pre>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">A se\u00e7\u00e3o \"replications\" \u00e9 onde as coisas interessantes acontecem. Observe que a entrada \u00e9 uma matriz. Voc\u00ea pode especificar qualquer n\u00famero de r\u00e9plicas. Aqui temos apenas uma.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para especificar uma replica\u00e7\u00e3o, voc\u00ea precisa fornecer uma origem e um destino. Lembre-se de que todas as replica\u00e7\u00f5es s\u00e3o unidirecionais.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">O par\u00e2metro \"source\" indica que queremos replicar o banco de dados identificado como \"db\". Voc\u00ea pode ver a se\u00e7\u00e3o em \"bancos de dados\", onde configuramos isso com o Walrus.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">O destino pode ser outro banco de dados conectado \u00e0 mesma inst\u00e2ncia do SG ou voc\u00ea pode especificar um URL HTTP, como fizemos aqui. Use o nome do banco de dados remoto para a parte do caminho do URL (\/db, neste caso).<\/p>\n<h4 id=\"running-sync-gateway\" style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Execu\u00e7\u00e3o do Sync Gateway<\/h4>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Salvei as configura\u00e7\u00f5es em dois arquivos, primary_gateway_config.json e backup_gateway_config.json. Voc\u00ea pode executar o SG manualmente a partir de uma linha de comando. Voc\u00ea pode encontrar informa\u00e7\u00f5es sobre o download e a execu\u00e7\u00e3o do SG para diferentes plataformas\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/installation\/sync-gateway\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">aqui<\/a>.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Eu inicio o backup primeiro. Caso contr\u00e1rio, o Primary emite muitas mensagens sobre falhas na conex\u00e3o para realizar a replica\u00e7\u00e3o.<\/p>\n<h2 id=\"the-java-app\" style=\"color: #000000;font-family: sans-serif;line-height: 25.6px;text-align: start\">O aplicativo Java<\/h2>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Escrevi o aplicativo Java usando Swing para a interface do usu\u00e1rio, usando o IntelliJ IDEA para o layout. Esta \u00e9 a apar\u00eancia do aplicativo na inicializa\u00e7\u00e3o.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\"><img decoding=\"async\" style=\"max-width: 800px\" src=\"\/wp-content\/original-assets\/2016\/september\/sync-gateway-inter-instance-replication-code-sample\/dbexplorer-0.png\" alt=\"DBExplorer on startup\" align=\"middle\" \/><\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para us\u00e1-lo, cole o JSON no painel de texto mais \u00e0 esquerda. Clique no bot\u00e3o Salvar. Isso armazena um novo documento JSON no banco de dados CBL. A sincroniza\u00e7\u00e3o est\u00e1 pronta para come\u00e7ar. Clique no bot\u00e3o Start para ativ\u00e1-la.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">O painel de texto do meio monitora o feed de altera\u00e7\u00f5es prim\u00e1rias. O painel mais \u00e0 direita monitora o feed de altera\u00e7\u00f5es de backup.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Com a sincroniza\u00e7\u00e3o ativada, toda vez que voc\u00ea salvar um documento, dever\u00e1 ver os feeds de altera\u00e7\u00f5es responderem. Veja como isso acontece.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\"><img decoding=\"async\" style=\"max-width: 800px\" src=\"\/wp-content\/original-assets\/2016\/september\/sync-gateway-inter-instance-replication-code-sample\/dbexplorer-1.png\" alt=\"DBExplorer after saving a document\" align=\"middle\" \/><\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Voc\u00ea pode encontrar a fonte do projeto em\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/github.com\/HodGreeley\/couchbase-lite-java-sg-replicate\">GitHub<\/a>. (Observe que esta amostra destaca os conceitos b\u00e1sicos. N\u00e3o \u00e9 um c\u00f3digo de qualidade de produ\u00e7\u00e3o). Vamos examinar algumas pe\u00e7as-chave.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">H\u00e1 quatro classes. A maior parte da interface do usu\u00e1rio est\u00e1 em DBExplorer.java. DBService.java \u00e9 uma classe auxiliar bastante t\u00edpica. D\u00ea uma olhada nela para ver como as replica\u00e7\u00f5es s\u00e3o configuradas entre o CBL e o SG. O Runtime.java existe principalmente para ter uma inst\u00e2ncia compartilhada de um\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/github.com\/FasterXML\/jackson\">Jackson<\/a>\u00a0JSON ObjectMapper.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">O SGMonitor.java se encarrega de monitorar os dois feeds de altera\u00e7\u00f5es. Eu uso o arquivo\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/square.github.io\/okhttp\/\">OkHttp<\/a>\u00a0da Square para fazer as chamadas REST.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para monitorar o feed de altera\u00e7\u00f5es, uso o que \u00e9 conhecido como longpolling. Com o longpoll, se n\u00e3o houver novos dados para transferir, a chamada HTTP n\u00e3o retorna imediatamente. Em vez disso, ela aguarda at\u00e9 que novos dados sejam enviados (ou at\u00e9 o tempo limite). A conex\u00e3o \u00e9 ent\u00e3o fechada. Isso significa que voc\u00ea precisa de um loop para continuar verificando os registros de altera\u00e7\u00f5es. Observe que os registros de altera\u00e7\u00f5es s\u00e3o enviados como JSON. Os resultados s\u00e3o agrupados como uma matriz, portanto, \u00e9 poss\u00edvel ter mais de um registro por resposta.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para simplificar a cria\u00e7\u00e3o da solicita\u00e7\u00e3o HTTP, criei um construtor de URL com os par\u00e2metros necess\u00e1rios para cada chamada adicionada.<\/p>\n<pre style=\"overflow: auto;font-size: medium;color: #000000;line-height: 25.6px;text-align: start\"><code class=\"language-Java hljs\" style=\"padding: 0.5em;color: #444444;background: #f0f0f0\">urlBuilder = HttpUrl.parse(url).newBuilder()\r\n        .addPathSegment(<span class=\"hljs-string\" style=\"color: #880000\">\"_changes\"<\/span>)\r\n        .addQueryParameter(<span class=\"hljs-string\" style=\"color: #880000\">\"feed\"<\/span>, <span class=\"hljs-string\" style=\"color: #880000\">\"longpoll\"<\/span>)\r\n        .addQueryParameter(<span class=\"hljs-string\" style=\"color: #880000\">\"timeout\"<\/span>, <span class=\"hljs-string\" style=\"color: #880000\">\"0\"<\/span>);\r\n<\/code><\/pre>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Lendo isso, estamos nos conectando ao ponto de extremidade _changes, usando um tipo de feed de longpoll e definindo o tempo limite como 0 (0 significa que nunca h\u00e1 tempo limite).<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Configurei um thread SwingWorker para executar o loop. Ele cria uma solicita\u00e7\u00e3o HTTP, dispara-a e aguarda a resposta.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">O truque final aqui \u00e9 informar ao Sync Gateway quais dados voc\u00ea precisa. Toda resposta SG _changes cont\u00e9m uma propriedade \"last_seq\". Essa propriedade \u00e9 apenas um n\u00famero inteiro que ajuda a rastrear quais registros um cliente j\u00e1 recebeu. \u00c9 responsabilidade do cliente manter o controle dos dados que processou. Depois de lidar com uma resposta, voc\u00ea precisa adicionar ou atualizar o par\u00e2metro \"since\" para solicita\u00e7\u00f5es futuras. Assim, o SG saber\u00e1 transmitir apenas as altera\u00e7\u00f5es mais recentes.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Aqui est\u00e1 a \u00faltima parte do loop.<\/p>\n<pre style=\"overflow: auto;font-size: medium;color: #000000;line-height: 25.6px;text-align: start\"><code class=\"language-Java hljs\" style=\"padding: 0.5em;color: #444444;background: #f0f0f0\">String body = response.body().string();\r\n\r\nJsonNode tree = mapper.readTree(body);\r\n\r\nurlBuilder.setQueryParameter(<span class=\"hljs-string\" style=\"color: #880000\">\"desde\"<\/span>, tree.get(<span class=\"hljs-string\" style=\"color: #880000\">\"last_seq\"<\/span>).asText());\r\n\r\npublish(body);\r\n<\/code><\/pre>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Uso o Jackson ObjectMapper para analisar o registro de altera\u00e7\u00f5es. Em seguida, adiciono \"since\" como um par\u00e2metro de consulta com o valor extra\u00eddo da propriedade last_seq. Isso configura o URL para a pr\u00f3xima solicita\u00e7\u00e3o. A chamada de publica\u00e7\u00e3o se encarrega de atualizar a \u00e1rea de texto na interface do usu\u00e1rio.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">\u00c9 isso a\u00ed.  O projeto inteiro pode ser executado em uma m\u00e1quina.  Isso permitir\u00e1 que voc\u00ea explore o Couchbase Lite, o Sync Gateway e as replica\u00e7\u00f5es em detalhes.  Aproveite.<\/p>\n<h2 id=\"postscript\" style=\"color: #000000;font-family: sans-serif;line-height: 25.6px;text-align: start\">P\u00f3s-escrito<\/h2>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Confira mais recursos em nosso\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/community\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">portal do desenvolvedor<\/a>\u00a0e nos siga no Twitter\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Voc\u00ea pode postar perguntas em nosso\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">f\u00f3runs<\/a>. E participamos ativamente de\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Estouro de pilha<\/a>.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Voc\u00ea pode me seguir pessoalmente em\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>In this\u00a0post, I went into some detail about replications between\u00a0Sync Gateway\u00a0(SG) instances in\u00a0Couchbase Mobile\u00a0(CBM). I wrote a simple Java application with a Swing-based UI to illustrate a working example. I run the app along with two instances of SG to [&hellip;]<\/p>","protected":false},"author":73,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[1562],"ppma_author":[9042],"class_list":["post-2384","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","tag-replication"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Sync Gateway Inter-instance Code Sample - The Couchbase Blog<\/title>\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\/sync-gateway-inter-instance-replication-code-sample\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sync Gateway Inter-instance Code Sample\" \/>\n<meta property=\"og:description\" content=\"In this\u00a0post, I went into some detail about replications between\u00a0Sync Gateway\u00a0(SG) instances in\u00a0Couchbase Mobile\u00a0(CBM). I wrote a simple Java application with a Swing-based UI to illustrate a working example. I run the app along with two instances of SG to [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/sync-gateway-inter-instance-replication-code-sample\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-11T06:43:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-24T08:08:46+00:00\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"Sync Gateway Inter-instance Code Sample\",\"datePublished\":\"2016-09-11T06:43:09+00:00\",\"dateModified\":\"2023-07-24T08:08:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/\"},\"wordCount\":1128,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"replication\"],\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/\",\"name\":\"Sync Gateway Inter-instance Code Sample - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-09-11T06:43:09+00:00\",\"dateModified\":\"2023-07-24T08:08:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#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\/sync-gateway-inter-instance-replication-code-sample\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sync Gateway Inter-instance Code Sample\"}]},{\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Sync Gateway Inter-instance Code Sample - The Couchbase Blog","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\/sync-gateway-inter-instance-replication-code-sample\/","og_locale":"pt_BR","og_type":"article","og_title":"Sync Gateway Inter-instance Code Sample","og_description":"In this\u00a0post, I went into some detail about replications between\u00a0Sync Gateway\u00a0(SG) instances in\u00a0Couchbase Mobile\u00a0(CBM). I wrote a simple Java application with a Swing-based UI to illustrate a working example. I run the app along with two instances of SG to [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/sync-gateway-inter-instance-replication-code-sample\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-09-11T06:43:09+00:00","article_modified_time":"2023-07-24T08:08:46+00:00","author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"Sync Gateway Inter-instance Code Sample","datePublished":"2016-09-11T06:43:09+00:00","dateModified":"2023-07-24T08:08:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/"},"wordCount":1128,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["replication"],"articleSection":["Couchbase Mobile"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/","url":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/","name":"Sync Gateway Inter-instance Code Sample - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-09-11T06:43:09+00:00","dateModified":"2023-07-24T08:08:46+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/#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\/sync-gateway-inter-instance-replication-code-sample\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Sync Gateway Inter-instance Code Sample"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Advogado do desenvolvedor, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley \u00e9 um defensor dos desenvolvedores da Couchbase e mora no Vale do Sil\u00edcio. Ele tem mais de duas d\u00e9cadas de experi\u00eancia como engenheiro de software e gerente de engenharia. Trabalhou em diversas \u00e1reas de software, incluindo f\u00edsica e qu\u00edmica computacional, seguran\u00e7a de computadores e redes, finan\u00e7as e dispositivos m\u00f3veis. Antes de ingressar na Couchbase em 2016, Hod liderou as rela\u00e7\u00f5es com desenvolvedores para dispositivos m\u00f3veis na Samsung. Hod \u00e9 Ph.D. em f\u00edsica qu\u00edmica pela Universidade de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley \u00e9 um defensor dos desenvolvedores da Couchbase e mora no Vale do Sil\u00edcio. Ele tem mais de duas d\u00e9cadas de experi\u00eancia como engenheiro de software e gerente de engenharia. Trabalhou em diversas \u00e1reas de software, incluindo f\u00edsica e qu\u00edmica computacional, seguran\u00e7a de computadores e redes, finan\u00e7as e dispositivos m\u00f3veis. Antes de ingressar na Couchbase em 2016, Hod liderou as rela\u00e7\u00f5es com desenvolvedores para dispositivos m\u00f3veis na Samsung. Hod \u00e9 Ph.D. em f\u00edsica qu\u00edmica pela Universidade de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2384","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2384"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2384\/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=2384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2384"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}