{"id":3980,"date":"2017-09-07T16:42:02","date_gmt":"2017-09-07T23:42:02","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3980"},"modified":"2025-06-13T20:46:36","modified_gmt":"2025-06-14T03:46:36","slug":"couchbases-history-everything-dcp","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/couchbases-history-everything-dcp\/","title":{"rendered":"A hist\u00f3ria de tudo do Couchbase: DCP"},"content":{"rendered":"<p><em>M. David Allen \u00e9 um engenheiro de software full-stack e empres\u00e1rio que, h\u00e1 mais de uma d\u00e9cada, trabalha com praticamente todas as linguagens de programa\u00e7\u00e3o e sistemas de banco de dados diferentes que pode usar. David trabalhou anteriormente em v\u00e1rios setores, incluindo finan\u00e7as, sa\u00fade e governo, concentrando-se normalmente em desafios de integra\u00e7\u00e3o de dados em grande escala, transi\u00e7\u00e3o de pesquisa aplicada e inova\u00e7\u00e3o tecnol\u00f3gica. Ele tem mestrado pela Virginia Commonwealth University, mas desde que deixou a educa\u00e7\u00e3o formal continua sendo um estudante permanente de tecnologia.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5662\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/09\/Simple-Small-Headshot-450x300-compressed-300x200.png\" alt=\"\" width=\"458\" height=\"305\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/Simple-Small-Headshot-450x300-compressed-300x200.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/Simple-Small-Headshot-450x300-compressed-400x267.png 400w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/Simple-Small-Headshot-450x300-compressed.png 450w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/Simple-Small-Headshot-450x300-compressed-20x13.png 20w\" sizes=\"auto, (max-width: 458px) 100vw, 458px\" \/><\/p>\n<h2>A hist\u00f3ria de tudo do Couchbase: DCP<\/h2>\n<p>Escondido atr\u00e1s de um acr\u00f4nimo DCP (protocolo de altera\u00e7\u00e3o de banco de dados), o Couchbase tem um superpoder secreto. A maioria das pessoas pensa em bancos de dados como locais de armazenamento de dados em um determinado momento. Mas com o <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/admin\/Concepts\/dcp.html\" target=\"_blank\" rel=\"noopener noreferrer\">Protocolo de altera\u00e7\u00e3o de banco de dados (DCP)<\/a><\/u>Em um cluster do Couchbase, um cluster do Couchbase pode ser visto como um fluxo cont\u00ednuo de altera\u00e7\u00f5es.<\/p>\n<p>Essencialmente, o Couchbase pode \"retroceder a hist\u00f3ria\" e reproduzir tudo o que aconteceu com o banco de dados desde o in\u00edcio. Ao fazer isso, ele pode resolver qualquer estado interno desde ent\u00e3o. Neste artigo, abordaremos o motivo pelo qual algu\u00e9m gostaria de fazer uma coisa t\u00e3o maluca em primeiro lugar e como podemos explorar esse superpoder para fazer coisas muito legais com nossos documentos.<\/p>\n<h2>O que \u00e9 DCP?<\/h2>\n<p>Como um banco de dados em cluster, o Couchbase aborda uma s\u00e9rie de problemas especializados que a arquitetura do banco de dados precisa resolver. Ele precisa manter v\u00e1rios n\u00f3s em sincronia uns com os outros, mesmo que um deles apresente problemas tempor\u00e1rios ou que haja uma interrup\u00e7\u00e3o de rede entre eles. Ele tamb\u00e9m precisa ser r\u00e1pido - r\u00e1pido o suficiente para receber grandes volumes de novos documentos e tamb\u00e9m lidar com consultas \u00e0 medida que elas surgem.<\/p>\n<p>Parte do projeto subjacente do Couchbase e como isso \u00e9 poss\u00edvel \u00e9 por meio de altera\u00e7\u00f5es de fluxo em um <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/architecture\/storage-architecture.html\" target=\"_blank\" rel=\"noopener noreferrer\">abordagem somente de anexos<\/a><\/u><a target=\"_blank\" rel=\"noopener noreferrer\">[1]<\/a>. Isso significa que, quando voc\u00ea altera um documento, o Couchbase n\u00e3o vai procurar o documento e modific\u00e1-lo no local em disco. Em vez disso, ele simplesmente acrescenta a um registro de chaves e valores qualquer que seja o resultado da sua muta\u00e7\u00e3o e continua. Dessa forma, as grava\u00e7\u00f5es podem ser feitas muito rapidamente e \u00e9 mais f\u00e1cil coordenar v\u00e1rios n\u00f3s.<\/p>\n<p>Se voc\u00ea estiver familiarizado com bancos de dados relacionais, a abordagem do DCP \u00e9 um pouco semelhante \u00e0 do <u><a href=\"https:\/\/www.postgresql.org\/docs\/9.1\/static\/wal-intro.html\" target=\"_blank\" rel=\"noopener noreferrer\">registro de grava\u00e7\u00e3o antecipada<\/a><\/u>\u00a0que voc\u00ea v\u00ea em outros softwares.<\/p>\n<h2>Por que se preocupar com a forma como o Couchbase faz isso internamente?<\/h2>\n<p>Em algum n\u00edvel, voc\u00ea quer que seu banco de dados se preocupe com os seguintes aspectos <em>para<\/em>\u00a0para que voc\u00ea n\u00e3o precise fazer isso. Mas, no caso do DCP, n\u00f3s nos preocupamos com isso porque podemos aproveitar esse fluxo de eventos e fazer todo tipo de coisa legal com ele, por exemplo:<\/p>\n<p><strong>Replica\u00e7\u00e3o de dados em bancos de dados completamente diferentes.<\/strong>\u00a0O Couchbase j\u00e1 tem v\u00e1rias op\u00e7\u00f5es dispon\u00edveis <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/connectors\/intro.html#concept_iy1_2rg_2s\" target=\"_blank\" rel=\"noopener noreferrer\">conectores<\/a><\/u>como o Elasticsearch. Voc\u00ea pode configurar um cluster separado do Elasticsearch e fazer com que ele contenha uma c\u00f3pia de todos os dados do Couchbase, expondo todos os seus dados aos recursos que o outro banco de dados pode oferecer a voc\u00ea. Manter esses dois clusters normalmente seria um problema de sincroniza\u00e7\u00e3o bastante complicado, mas como os conectores s\u00e3o alimentados principalmente pelo DCP, podemos pensar nas mensagens do DCP como um fluxo de \"git commits\" que mant\u00e9m continuamente o outro banco de dados atualizado.<\/p>\n<p><strong>Uso de abordagens baseadas em filas e integra\u00e7\u00e3o com outros microsservi\u00e7os.<\/strong>\u00a0Se voc\u00ea puder escrever um trecho de c\u00f3digo para escutar esse fluxo DCP, tamb\u00e9m poder\u00e1 filtr\u00e1-lo apenas para as mensagens de seu interesse. Talvez seja apenas quando algo \u00e9 exclu\u00eddo ou apenas atualiza\u00e7\u00f5es de um determinado tipo de documento. Em ambos os casos, voc\u00ea pode usar um cliente DCP para filtrar esse fluxo de mensagens e publicar as mensagens extras em uma fila do RabbitMQ, <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/connectors\/kafka-2.0\/kafka-intro.html\" target=\"_blank\" rel=\"noopener noreferrer\">um t\u00f3pico do Kafka<\/a><\/u>ou o que voc\u00ea precisar. Isso pode ser muito \u00fatil para implementar outras l\u00f3gicas comerciais complexas. Por exemplo, imagine uma companhia de seguros que, dependendo do estado do cliente, precisa acionar alguma l\u00f3gica adicional relacionada \u00e0 conformidade. Ou\u00e7a as muta\u00e7\u00f5es nos documentos do cliente, filtre por estado, publique na fila certa e deixe que outro servi\u00e7o se preocupe com a diferen\u00e7a entre o que deve ser feito para os clientes da Virg\u00ednia e os de Maryland.<\/p>\n<p><strong>An\u00e1lise de s\u00e9ries temporais\/revis\u00f5es.<\/strong>\u00a0Cada valor em seu banco de dados muda com o tempo. Alguns s\u00e3o escritos uma vez e esquecidos. Outros podem ser atualizados com frequ\u00eancia. Para aqueles que s\u00e3o atualizados com frequ\u00eancia, o DCP permite que voc\u00ea trate cada item como um <u><a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_series\" target=\"_blank\" rel=\"noopener noreferrer\">s\u00e9ries temporais<\/a><\/u>. Voc\u00ea sabe qual era o valor anterior, quando foi alterado e para que foi alterado. Isso permite fam\u00edlias inteiras de an\u00e1lises de dados downstream interessantes. Voc\u00ea acha que as pessoas fazem mais avalia\u00e7\u00f5es de cervejas em seu site nas noites de sexta-feira e s\u00e1bado, ou nas manh\u00e3s de ter\u00e7a-feira?<\/p>\n<p>Essencialmente, o DCP pode ser usado como uma esp\u00e9cie de cola arquitet\u00f4nica; uma forma de obter dados do Couchbase para outros sistemas, o que torna o Couchbase mais f\u00e1cil e mais flex\u00edvel para integra\u00e7\u00e3o com outros sistemas.<\/p>\n<p>Por fim, \u00e9 preciso dizer que o recurso padr\u00e3o de replica\u00e7\u00e3o entre datacenters (XDCR) do Couchbase, que permite replicar para outro cluster do Couchbase para backup e recupera\u00e7\u00e3o de desastres<strong>\u00a0<\/strong><u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/admin\/XDCR\/xdcr-memory-replication.html\" target=\"_blank\" rel=\"noopener noreferrer\">pode usar o DCP da mesma forma<\/a><\/u>. Portanto, essencialmente, o DCP n\u00e3o \u00e9 apenas um \"recurso extra agrad\u00e1vel de se ter\", ele est\u00e1 realmente incorporado ao n\u00facleo, desde os fundamentos de como a arquitetura de armazenamento funciona, at\u00e9 o fornecimento de uma base para outros recursos do Couchbase, como o XDCR.<\/p>\n<h2>E se eu quisesse fazer ?<\/h2>\n<p>Voc\u00ea precisar\u00e1 de um cliente DCP, que \u00e9 apenas um m\u00f3dulo de software que permite aceitar mensagens DCP e process\u00e1-las. No momento em que escrevo, h\u00e1 um bom m\u00f3dulo pronto para <u><a href=\"https:\/\/github.com\/couchbase\/java-dcp-client\" target=\"_blank\" rel=\"noopener noreferrer\">Java<\/a><\/u>e um para <u><a href=\"https:\/\/github.com\/couchbaselabs\/python-dcp-client\" target=\"_blank\" rel=\"noopener noreferrer\">Python<\/a><\/u>\u00a0tamb\u00e9m, embora ele possa estar desatualizado.<\/p>\n<h2>Alguns detalhes do DCP ...<\/h2>\n<p>O DCP pode ser considerado basicamente como um fluxo de mensagens de muta\u00e7\u00e3o e exclus\u00e3o. Uma muta\u00e7\u00e3o ocorre sempre que uma chave ou o conte\u00fado por tr\u00e1s dela \u00e9 alterado de alguma forma. Uma exclus\u00e3o \u00e9 exatamente o que parece. <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/connectors\/kafka-2.0\/kafka-intro.html\" target=\"_blank\" rel=\"noopener noreferrer\">H\u00e1 outros tipos de mensagens DCP<\/a><\/u>mas, por enquanto, vamos nos limitar a exclus\u00f5es e muta\u00e7\u00f5es.<\/p>\n<p>O que h\u00e1 em uma mensagem DCP? Dois itens importantes incluem:<\/p>\n<ul>\n<li><strong>Um identificador do vBucket.<\/strong>\u00a0Nos bastidores, o Couchbase \u00e9 apenas um grande armazenamento de chave\/valor. Como sabemos que se trata de um banco de dados distribu\u00eddo, o Couchbase divide todas as chaves do banco de dados e as atribui a diferentes \"parti\u00e7\u00f5es\", chamadas vBuckets. O identificador do vBucket apenas informa ao banco de dados qual segmento do espa\u00e7o de chaves est\u00e1 mudando. <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/concepts\/distributed-data-management.html\" target=\"_blank\" rel=\"noopener noreferrer\">H\u00e1 muito mais informa\u00e7\u00f5es dispon\u00edveis sobre esse t\u00f3pico<\/a><\/u>\u00a0se voc\u00ea quiser se aprofundar, mas h\u00e1 muita configurabilidade no Couchbase em torno dos vBuckets. Nesta imagem, podemos ver que 9 vBuckets est\u00e3o sendo distribu\u00eddos em 3 servidores, sem redund\u00e2ncia.<\/li>\n<li><strong>Um n\u00famero crescente.<\/strong>\u00a0O valor do n\u00famero n\u00e3o \u00e9 muito importante, mas o que \u00e9 importante \u00e9 que ele sempre aumenta. \u00c9 assim que o Couchbase pode ordenar todas as mensagens DCP no tempo, o que \u00e9 muito importante.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"194\" class=\"wp-image-3978\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/09\/vbuckets.png\" alt=\"vbuckets\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/vbuckets.png 636w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/vbuckets-300x92.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/vbuckets-20x6.png 20w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/p>\n<p><em>Fonte da imagem: <\/em><u><a href=\"https:\/\/static.couchbaseinc.hosting.ca.onehippo.com\/images\/server\/3.x\/20170420-170703\/vbuckets.png\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/static.couchbaseinc.hosting.ca.onehippo.com\/images\/server\/3.x\/20170420-170703\/vbuckets.png<\/a><\/u><\/p>\n<h2>Nosso caso de uso simples<\/h2>\n<p>Vamos pegar o <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/admin\/Misc\/sample-bucket-beer.html\" target=\"_blank\" rel=\"noopener noreferrer\">amostra de cerveja<\/a><\/u>\u00a0como um exemplo. Os usu\u00e1rios podem classificar as cervejas; quando a classifica\u00e7\u00e3o agregada de uma cerveja atinge um determinado limite, o pessoal de marketing quer saber. Eles provavelmente ligar\u00e3o para o fabricante da cerveja e perguntar\u00e3o se ele quer anunciar em nosso site de cervejas. Ou, melhor ainda, talvez se alguma cerveja atingir 5 estrelas, eles far\u00e3o um estoque para a pr\u00f3xima reuni\u00e3o da empresa. De qualquer forma, eles querem saber sobre as cervejas 5 estrelas.<\/p>\n<p>O problema \u00e9 que o pessoal de marketing tem um sistema de leads separado. Podemos notific\u00e1-los fazendo uma simples postagem HTTP em seu sistema. Quando uma cerveja atinge 5 estrelas, notificamos o sistema de leads deles para que verifiquem a Foo Brew.<\/p>\n<h2>C\u00f3digo<\/h2>\n<p>O c\u00f3digo abaixo foi adaptado do tutorial sobre o\u00a0<u><a href=\"https:\/\/github.com\/couchbase\/java-dcp-client\" target=\"_blank\" rel=\"noopener noreferrer\">Cliente Java DCP<\/a><\/u>. Depois de entender o que est\u00e1 acontecendo, \u00e9 muito simples adapt\u00e1-lo \u00e0s suas necessidades.<\/p>\n<pre class=\"lang:default decode:true\">package com.foo.app;\r\n\r\nimport com.couchbase.client.dcp.Client;\r\n\r\nimport com.couchbase.client.dcp.message.DcpMutationMessage;\r\n\r\nimport com.couchbase.client.dcp.DataEventHandler;\r\n\r\nimport com.couchbase.client.dcp.ControlEventHandler;\r\n\r\nimport com.couchbase.client.deps.io.netty.buffer.ByteBuf;\r\n\r\nimport com.couchbase.client.dcp.transport.netty.ChannelFlowController;\r\n\r\nimport com.couchbase.client.dcp.message.DcpDeletionMessage;\r\n\r\nimport com.couchbase.client.dcp.StreamFrom;\r\n\r\nimport com.couchbase.client.dcp.StreamTo;\r\n\r\nimport java.util.concurrent.TimeUnit;\r\n\r\nimport com.couchbase.client.deps.io.netty.util.CharsetUtil;\r\n\r\nimport com.google.gson.JsonParser;\r\n\r\nimport com.google.gson.JsonObject;\r\n\r\npublic class App {\r\n\r\n\u00a0 \u00a0public static void main(String[] args) throws Exception {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0final JsonParser parser = new JsonParser();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0final Client client = Client.configure().hostnames(\"localhost\").bucket(\"beer-sample\").build();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ Don't do anything with control events in this example\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0client.controlEventHandler(new ControlEventHandler() {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public void onEvent(ChannelFlowController flowController, ByteBuf event) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0event.release();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0});\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0client.dataEventHandler(new DataEventHandler() {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public void onEvent(ChannelFlowController flowController, ByteBuf event) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if (DcpMutationMessage.is(event)) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0JsonObject obj = parser.parse(DcpMutationMessage.content(event).toString(CharsetUtil.UTF_8)).getAsJsonObject();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if (obj.get(\"rating\") != null &amp;&amp; obj.get(\"rating\").getAsInt() &gt; 4) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ OMG, marketing guys gonna love this stuff...\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\"Tasty beer located: \" + obj.get(\"name\").getAsString());\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0} else if (DcpDeletionMessage.is(event)) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ System.out.println(\"Goodbye, tasty beer! \" + DcpDeletionMessage.toString(event));\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0event.release();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0});\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ Connect the sockets\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0client.connect().await();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ Initialize the state (start now, never stop)\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0client.initializeState(StreamFrom.BEGINNING, StreamTo.INFINITY).await();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ Start streaming on all partitions\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0client.startStreaming().await();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ Sleep for some time to print the mutations\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ The printing happens on the IO threads!\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0Thread.sleep(TimeUnit.MINUTES.toMillis(10));\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ Once the time is over, shutdown.\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0client.disconnect().await();\r\n\r\n\u00a0 \u00a0}\r\n\r\n}\r\n\r\n<\/pre>\n<h2><span style=\"color: #343e47;font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 60px\">O que est\u00e1 acontecendo nesse c\u00f3digo?<\/span><\/h2>\n<ul>\n<li>Conectar-se a uma inst\u00e2ncia de cliente (e a um determinado bucket)<\/li>\n<li>Informe ao cliente em qual intervalo de tempo de mensagens estamos interessados. Estamos buscando o hist\u00f3rico completo do cluster, mas podemos escolher qualquer per\u00edodo de tempo que desejarmos:  StreamFrom.BEGINNING, StreamTo.INFINITY<\/li>\n<li>Informe ao cliente como processar uma mensagem individual; esse \u00e9 o c\u00f3digo dataEventHandler.<\/li>\n<li>No nosso caso, estamos analisando o JSON do documento subjacente e verificando a classifica\u00e7\u00e3o da cerveja.<\/li>\n<li>Nesse caso, nosso processo \u00e9 executado para sempre, recebendo continuamente novas mensagens \u00e0 medida que elas ocorrem.<\/li>\n<\/ul>\n<h2>Pontos a serem considerados<\/h2>\n<p>Em nosso exemplo simplificado, o que estamos armazenando no Couchbase \u00e9 sempre um documento JSON. Mas esse n\u00e3o precisa ser o caso. Portanto, em seu aplicativo, voc\u00ea provavelmente precisar\u00e1 incorporar mais alguns recursos inteligentes para filtrar com base nas chaves de seu interesse e n\u00e3o tentar analisar tudo como JSON. O conte\u00fado do evento DCP \u00e9 um buffer de bytes, n\u00e3o \u00e9 uma cadeia de caracteres ou um documento JSON. Isso \u00e9 fiel \u00e0 forma do que o Couchbase est\u00e1 realmente armazenando sob o cap\u00f4.<\/p>\n<p>O DCP tamb\u00e9m informa as muta\u00e7\u00f5es em pontos \u00fanicos no tempo. Um detalhe que deixamos passar um pouco \u00e9 que, embora as classifica\u00e7\u00f5es de determinadas cervejas possam ficar acima de 4, isso n\u00e3o \u00e9 uma garantia de que a cerveja seja classificada dessa forma <em>agora mesmo<\/em>, apenas uma garantia de que era <em>uma vez que sofreu muta\u00e7\u00e3o<\/em>\u00a0para esse estado. Uma constru\u00e7\u00e3o mais sofisticada pode levar isso em conta.<\/p>\n<p>Por fim, lembre-se de que isso realmente pode ser longo, dependendo do tamanho e da velocidade de muta\u00e7\u00e3o do cluster. Portanto, talvez seja melhor dar uma olhada em <u><a href=\"https:\/\/github.com\/couchbase\/java-dcp-client#flow-control\" target=\"_blank\" rel=\"noopener noreferrer\">t\u00e9cnicas de controle de fluxo<\/a><\/u>\u00a0para que seu cliente possa acompanhar o fluxo de eventos.<\/p>\n<h2>Qual \u00e9 o pr\u00f3ximo passo?<\/h2>\n<p>Agora que voc\u00ea j\u00e1 est\u00e1 familiarizado com os DCPs, talvez queira dar uma olhada em <u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/connectors\/intro.html\" target=\"_blank\" rel=\"noopener noreferrer\">Conectores dispon\u00edveis do Couchbase<\/a><\/u>que, em sua maioria, j\u00e1 dependem do DCP e oferecem a voc\u00ea uma maneira de aproveitar tudo isso sem nenhuma codifica\u00e7\u00e3o.<\/p>\n<p>Outro t\u00f3pico a ser analisado \u00e9 <u><a href=\"https:\/\/aws.amazon.com\/streaming-data\/\" target=\"_blank\" rel=\"noopener noreferrer\">sistemas de dados de streaming<\/a><\/u>e os tipos de an\u00e1lises que podem ser feitas \"on the fly\" em fluxos de dados em vez de em dados no local. A maioria dos provedores de computa\u00e7\u00e3o em nuvem, como AWS, Google Compute Engine e outros, est\u00e1 fazendo coisas not\u00e1veis nesse espa\u00e7o e, com o DCP, voc\u00ea pode colocar tudo o que tiver em seu cluster do Couchbase em um fluxo de dados que pode ser conectado a qualquer uma dessas poderosas ferramentas downstream.<\/p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\">[1]<\/a>\u00a0\u00c9 um pouco mais complicado, mas estou simplificando e vinculando a arquitetura de armazenamento para que voc\u00ea possa se aprofundar no aprendizado desse t\u00f3pico.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/community\/community-writers-program\/\"><em>Esta postagem faz parte do Programa de Reda\u00e7\u00e3o da Comunidade Couchbase<\/em><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Escondido atr\u00e1s de um acr\u00f4nimo (DCP), o Couchbase tem um superpoder secreto. A maioria das pessoas pensa nos bancos de dados como locais de armazenamento de dados em um determinado momento. Mas com o Database Change Protocol (DCP), um cluster do Couchbase pode ser visto como um fluxo cont\u00ednuo de altera\u00e7\u00f5es.<\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,9415],"tags":[10124,1976],"ppma_author":[9026],"class_list":["post-3980","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-xdcr","tag-amazon-web-services-aws","tag-dcp"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Database Change Protocol: History of DCP | Couchbase<\/title>\n<meta name=\"description\" content=\"Database Change Protocol (DCP) can be viewed as an ongoing stream of changes. Rewind history and replay what happened to the database from the beginning.\" \/>\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\/couchbases-history-everything-dcp\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase\u2019s History of Everything: DCP\" \/>\n<meta property=\"og:description\" content=\"Database Change Protocol (DCP) can be viewed as an ongoing stream of changes. Rewind history and replay what happened to the database from the beginning.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbases-history-everything-dcp\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-07T23:42:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:46:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/Simple-Small-Headshot-450x300-compressed.png\" \/>\n\t<meta property=\"og:image:width\" content=\"450\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Couchbase\u2019s History of Everything: DCP\",\"datePublished\":\"2017-09-07T23:42:02+00:00\",\"dateModified\":\"2025-06-14T03:46:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\"},\"wordCount\":1775,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Amazon Web Services (AWS)\",\"DCP\"],\"articleSection\":[\"Couchbase Server\",\"Cross Data Center Replication (XDCR)\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\",\"name\":\"Database Change Protocol: History of DCP | Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-09-07T23:42:02+00:00\",\"dateModified\":\"2025-06-14T03:46:36+00:00\",\"description\":\"Database Change Protocol (DCP) can be viewed as an ongoing stream of changes. Rewind history and replay what happened to the database from the beginning.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#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\/couchbases-history-everything-dcp\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase\u2019s History of Everything: DCP\"}]},{\"@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\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Database Change Protocol: History of DCP | Couchbase","description":"Database Change Protocol (DCP) can be viewed as an ongoing stream of changes. Rewind history and replay what happened to the database from the beginning.","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\/couchbases-history-everything-dcp\/","og_locale":"pt_BR","og_type":"article","og_title":"Couchbase\u2019s History of Everything: DCP","og_description":"Database Change Protocol (DCP) can be viewed as an ongoing stream of changes. Rewind history and replay what happened to the database from the beginning.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/couchbases-history-everything-dcp\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-09-07T23:42:02+00:00","article_modified_time":"2025-06-14T03:46:36+00:00","og_image":[{"width":450,"height":300,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/09\/Simple-Small-Headshot-450x300-compressed.png","type":"image\/png"}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Couchbase\u2019s History of Everything: DCP","datePublished":"2017-09-07T23:42:02+00:00","dateModified":"2025-06-14T03:46:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/"},"wordCount":1775,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Amazon Web Services (AWS)","DCP"],"articleSection":["Couchbase Server","Cross Data Center Replication (XDCR)"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/","url":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/","name":"Database Change Protocol: History of DCP | Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-09-07T23:42:02+00:00","dateModified":"2025-06-14T03:46:36+00:00","description":"Database Change Protocol (DCP) can be viewed as an ongoing stream of changes. Rewind history and replay what happened to the database from the beginning.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/#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\/couchbases-history-everything-dcp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase\u2019s History of Everything: DCP"}]},{"@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\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, gerente da comunidade de desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski \u00e9 a Snr. Developer Community Manager da Couchbase, supervisionando a comunidade. Ela \u00e9 respons\u00e1vel pelo nosso boletim informativo mensal para desenvolvedores.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","first_name":"Laura","last_name":"Czajkowski","user_url":"","author_category":"","description":"Laura Czajkowski \u00e9 a Snr. Developer Community Manager da Couchbase, supervisionando a comunidade. Ela \u00e9 respons\u00e1vel pelo nosso boletim informativo mensal para desenvolvedores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3980","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\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=3980"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3980\/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=3980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=3980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=3980"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=3980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}