{"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\/es\/sync-gateway-inter-instance-replication-code-sample\/","title":{"rendered":"Ejemplo de c\u00f3digo entre instancias de Sync Gateway"},"content":{"rendered":"<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">En este\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/es\/new-couchbase-mobile-v1.3-inter-instance-replication-sync-gateway\/\">Correo electr\u00f3nico:<\/a>En la secci\u00f3n \"Repeticiones\", entr\u00e9 en detalle sobre las r\u00e9plicas 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\">Pasarela de sincronizaci\u00f3n<\/a>\u00a0(SG) instancias en\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase M\u00f3vil<\/a>\u00a0(CBM). Escrib\u00ed una sencilla aplicaci\u00f3n Java con una interfaz de usuario basada en Swing para ilustrar un ejemplo de trabajo. Ejecuto la aplicaci\u00f3n junto con dos instancias de SG para demostrarlo todo.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Este diagrama muestra el flujo en la aplicaci\u00f3n y las comunicaciones con el 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\">Un panel de edici\u00f3n nos permite introducir datos JSON. Esos datos se guardan en el archivo\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Lite<\/a>\u00a0(CBL) de almacenamiento local. Tenemos dos r\u00e9plicas configuradas. Uno empuja los datos de la base de datos CBL a la instancia de Sync Gateway que llam\u00e9 la instancia primaria. Me referir\u00e9 a ella simplemente como Primaria. Primaria se replica a la instancia de copia de seguridad SG (en lo sucesivo, Backup).<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para que esto ocurra, controlo el\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\">_cambios de alimentaci\u00f3n<\/a>\u00a0tanto del primario como del de reserva.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Todo funciona a la vez en mi Mac. Puede configurar una pila CBM completa que se ejecute en su m\u00e1quina de desarrollo. Esto facilita el desarrollo inicial. Tambi\u00e9n ayuda a entender c\u00f3mo todas las piezas encajan y funcionan. Escribir\u00e9 m\u00e1s sobre esto en el futuro.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Veamos las configuraciones y el c\u00f3digo.<\/p>\n<h2 id=\"configuring-sync-gateway\" style=\"color: #000000;font-family: sans-serif;line-height: 25.6px;text-align: start\">Configuraci\u00f3n de Sync Gateway<\/h2>\n<h4 id=\"backup\" style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Copia de seguridad<\/h4>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Ejecuto cada instancia SG con su propio archivo de configuraci\u00f3n JSON. La configuraci\u00f3n para Backup es un poco m\u00e1s simple. Aqu\u00ed est\u00e1.<\/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\">interfaz<\/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\">bases de datos<\/span>\": {\r\n    \"<span class=\"hljs-attr\">db<\/span>\": {\r\n      \"<span class=\"hljs-attr\">servidor<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"morsa:\"<\/span>,\r\n      \"<span class=\"hljs-attr\">usuarios<\/span>\": { \"<span class=\"hljs-attr\">INVITADO<\/span>\": {\"<span class=\"hljs-attr\">desactivado<\/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\">Dado que ejecutamos dos copias de SG, tenemos que asegurarnos de que utilizan puertos de red diferentes. Por defecto, SG utiliza los puertos 4984 y 4985. El primer par de l\u00edneas para Backup lo configuran para escuchar en los puertos 5984 y 5985 en su lugar. No hay nada especial en esos puertos. S\u00f3lo aseg\u00farese de elegir los que no son utilizados por otras aplicaciones en su m\u00e1quina.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">El resto del archivo de configuraci\u00f3n hace que SG registre todo, se configura para servir datos de una base de datos en memoria de prop\u00f3sito especial (indicada por la palabra clave \"walrus\"), y permite el acceso abierto a cualquiera a trav\u00e9s del usuario \"GUEST\". Esta es una buena pieza a recordar para el desarrollo temprano. Morsa le permite utilizar SG independiente, sin un servidor backend. El uso de GUEST con todos los accesos significa que puedes poner las cosas en marcha sin preocuparte por la autenticaci\u00f3n y la configuraci\u00f3n del canal. Nota por defecto SG registra en stderr. Puedes a\u00f1adir una opci\u00f3n para que se registre en un archivo en su lugar.<\/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\">Replicaci\u00f3n primaria y entre instancias<\/h4>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Configuramos la replicaci\u00f3n push en la configuraci\u00f3n para Primary. Tiene algunos de los mismos par\u00e1metros.<\/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\">bases de datos<\/span>\": {\r\n    \"<span class=\"hljs-attr\">db<\/span>\": {\r\n      \"<span class=\"hljs-attr\">servidor<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"morsa:\"<\/span>,\r\n      \"<span class=\"hljs-attr\">usuarios<\/span>\": { \"<span class=\"hljs-attr\">INVITADO<\/span>\": {\"<span class=\"hljs-attr\">desactivado<\/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\">r\u00e9plicas<\/span>\":[\r\n    {\r\n      \"<span class=\"hljs-attr\">fuente<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"db\"<\/span>,\r\n      \"<span class=\"hljs-attr\">objetivo<\/span>\": <span class=\"hljs-string\" style=\"color: #880000\">\"https:\/\/localhost:5985\/db\"<\/span>,\r\n      \"<span class=\"hljs-attr\">continuo<\/span>\": <span class=\"hljs-literal\" style=\"color: #1f811f\">verdadero<\/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\">La secci\u00f3n \"r\u00e9plicas\" es donde ocurren las cosas interesantes. Observe que la entrada es una matriz. Puede especificar cualquier n\u00famero de r\u00e9plicas. Aqu\u00ed s\u00f3lo tenemos una.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para especificar una replicaci\u00f3n, debe proporcionar un origen y un destino. Recuerde que todas las r\u00e9plicas son unidireccionales.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">El par\u00e1metro \"source\" indica que queremos replicar la base de datos identificada como \"db\". Puedes ver la secci\u00f3n en \"bases de datos\" donde configuramos esto con Walrus.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">El destino puede ser otra base de datos conectada a la misma instancia SG, o puede especificar una URL HTTP como hicimos aqu\u00ed. Utilice el nombre de la base de datos remota para la parte de la ruta de la URL (\/db en este 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\">Ejecuci\u00f3n de Sync Gateway<\/h4>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">He guardado las configuraciones en dos archivos, primary_gateway_config.json y backup_gateway_config.json. Puedes ejecutar SG manualmente desde una l\u00ednea de comandos. Puedes encontrar informaci\u00f3n sobre c\u00f3mo descargar y ejecutar 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\">aqu\u00ed<\/a>.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Primero inicio Backup. De lo contrario, Primary emite un mont\u00f3n de mensajes sobre fallos al conectarse para realizar la replicaci\u00f3n.<\/p>\n<h2 id=\"the-java-app\" style=\"color: #000000;font-family: sans-serif;line-height: 25.6px;text-align: start\">La aplicaci\u00f3n Java<\/h2>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Escrib\u00ed la aplicaci\u00f3n Java utilizando Swing para la interfaz de usuario, utilizando IntelliJ IDEA para el dise\u00f1o. Este es el aspecto de la aplicaci\u00f3n al iniciarse.<\/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 utilizarlo, pegue JSON en el panel de texto situado m\u00e1s a la izquierda. Pulse el bot\u00f3n Guardar. Eso almacena un nuevo documento JSON en la base de datos CBL. La sincronizaci\u00f3n est\u00e1 desactivada para empezar. Haga clic en el bot\u00f3n Iniciar para activarla.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">El panel de texto del medio controla los cambios en el primario. El panel de la derecha controla los cambios en la copia de seguridad.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Con la sincronizaci\u00f3n activada, cada vez que guardes un documento deber\u00edas ver que ambos cambios responden. Esto es lo que parece.<\/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\">Encontrar\u00e1 la fuente del proyecto en\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/github.com\/HodGreeley\/couchbase-lite-java-sg-replicate\">GitHub<\/a>. (Tenga en cuenta que este ejemplo destaca los aspectos b\u00e1sicos. No es c\u00f3digo de calidad de producci\u00f3n). Examinemos algunas piezas clave.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Hay cuatro clases. La mayor parte de la interfaz de usuario est\u00e1 en DBExplorer.java. DBService.java es una clase de ayuda bastante t\u00edpica. Echa un vistazo all\u00ed para ver c\u00f3mo se establecen las r\u00e9plicas entre CBL y SG. Runtime.java existe principalmente para tener una instancia compartida de un\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/github.com\/FasterXML\/jackson\">Jackson<\/a>\u00a0Mapeador de objetos JSON.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">SGMonitor.java se encarga de monitorizar los dos feeds de cambios. Utilizo el archivo\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/square.github.io\/okhttp\/\">OkHttp<\/a>\u00a0de Square para realizar las llamadas REST.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para monitorizar la alimentaci\u00f3n de cambios, utilizo lo que se conoce como longpolling. Con longpoll, si no hay nuevos datos para transferir, la llamada HTTP no vuelve inmediatamente. En su lugar, espera hasta que se env\u00edan nuevos datos (o se agota el tiempo de espera). Entonces se cierra la conexi\u00f3n. Esto significa que necesitas un bucle para seguir comprobando los registros de cambios. Tenga en cuenta que los registros de cambios se env\u00edan como JSON. Los resultados se agrupan como una matriz, por lo que puede tener m\u00e1s de un registro por respuesta.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Para simplificar la creaci\u00f3n de la petici\u00f3n HTTP, creo un constructor de URL con los par\u00e1metros necesarios para cada llamada a\u00f1adidos.<\/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\">\"_cambios\"<\/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\">Leyendo esto, nos estamos conectando al punto final _changes, utilizando un tipo de alimentaci\u00f3n longpoll, y estableciendo el tiempo de espera en 0 (0 significa que nunca se agota el tiempo de espera).<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">He creado un hilo SwingWorker para ejecutar el bucle. Crea una petici\u00f3n HTTP, la lanza y espera la respuesta.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">El truco final est\u00e1 en decirle a Sync Gateway qu\u00e9 datos necesita. Cada respuesta SG _changes contiene una propiedad \"last_seq\". Esta propiedad es s\u00f3lo un n\u00famero entero que ayuda a realizar un seguimiento de los registros que un cliente ya ha recibido. Es responsabilidad del cliente llevar la cuenta de los datos que ha procesado. Una vez que ha manejado una respuesta, necesita a\u00f1adir o actualizar el par\u00e1metro \"since\" a futuras peticiones. SG sabr\u00e1 entonces que debe pasar s\u00f3lo los cambios m\u00e1s recientes.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Aqu\u00ed est\u00e1 la \u00faltima parte del bucle.<\/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\">Utilizo el Jackson ObjectMapper para analizar el registro de cambios. Luego a\u00f1ado \"since\" como par\u00e1metro de consulta con el valor extra\u00eddo de la propiedad last_seq. Esto configura la URL para la siguiente petici\u00f3n. La llamada de publicaci\u00f3n se encarga de actualizar el \u00e1rea de texto en la interfaz de usuario.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Eso es todo.  Todo el proyecto se puede ejecutar en una sola m\u00e1quina.  Esto te permitir\u00e1 explorar Couchbase Lite, Sync Gateway y las r\u00e9plicas en detalle.  Que lo disfrutes.<\/p>\n<h2 id=\"postscript\" style=\"color: #000000;font-family: sans-serif;line-height: 25.6px;text-align: start\">Posdata<\/h2>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Consulte m\u00e1s recursos en nuestra\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/community\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">portal para desarrolladores<\/a>\u00a0y s\u00edganos en 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\">Puede enviar preguntas a nuestro\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">foros<\/a>. Y participamos activamente en\u00a0<a style=\"color: #265778;text-decoration: none\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<\/p>\n<p style=\"color: #000000;font-family: sans-serif;font-size: medium;line-height: 25.6px;text-align: start\">Puede seguirme personalmente en\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 v26.1 (Yoast SEO v26.1.1) - 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\/es\/sync-gateway-inter-instance-replication-code-sample\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/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\/es\/sync-gateway-inter-instance-replication-code-sample\/","og_locale":"es_MX","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\/es\/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":"es","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":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sync-gateway-inter-instance-replication-code-sample\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@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 es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/es\/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 es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2384"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2384\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2384"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}