{"id":2010,"date":"2016-01-21T19:13:26","date_gmt":"2016-01-21T19:13:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2010"},"modified":"2020-02-03T04:33:05","modified_gmt":"2020-02-03T12:33:05","slug":"kafka-and-couchbase-up-and-running-in-10-minutes","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/kafka-and-couchbase-up-and-running-in-10-minutes\/","title":{"rendered":"Kafka e Couchbase: Comece a usar o consumidor Kafka de amostra em 10 minutos"},"content":{"rendered":"<h2>Introdu\u00e7\u00e3o<\/h2>\n<p>O Couchbase Kafka Connector 1.2.0 acaba de ser lan\u00e7ado. Juntamente com as v\u00e1rias corre\u00e7\u00f5es de bugs, h\u00e1 um novo c\u00f3digo de amostra para um consumidor Kafka, al\u00e9m do produtor Kafka que estava dispon\u00edvel anteriormente. Para revisar rapidamente os termos:<\/p>\n<ul>\n<li>Um produtor do Kafka grava dados no Kafka, portanto, \u00e9 uma fonte de mensagens do ponto de vista do Kafka.<\/li>\n<li>Na terminologia do Kafka, um consumidor \u00e9 um processo que se inscreve em t\u00f3picos e, em seguida, faz algo com o feed de mensagens publicadas que s\u00e3o emitidas por um cluster do Kafka. \u00c9 basicamente um sink.<\/li>\n<\/ul>\n<p>Neste blog, voc\u00ea come\u00e7ar\u00e1 a trabalhar com um consumidor Kafka de amostra no estilo \"Hello World!\" que grava no Couchbase. Ao longo do caminho, voc\u00ea tamb\u00e9m obter\u00e1 um ambiente sandbox com um broker Kafka e um servidor Couchbase de n\u00f3 \u00fanico para que possa executar e modificar o consumidor e o produtor de amostra.<\/p>\n<h2>Instala\u00e7\u00e3o de pr\u00e9-requisitos<\/h2>\n<p>O <a href=\"https:\/\/github.com\/couchbase\/couchbase-kafka-connector\/tree\/master\/samples\">amostras<\/a> fazem parte do <a href=\"https:\/\/github.com\/couchbase\/couchbase-kafka-connector\">Conector Kafka do Couchbase<\/a> \u00e1rvore de origem. Para obt\u00ea-los, basta clonar o reposit\u00f3rio inteiro:<\/p>\n<pre><code class=\"language-bash\">$ git clone git:\/\/github.com\/couchbase\/couchbase-kafka-connector.git \/tmp\/kafka-connector<\/code><\/pre>\n<p>Agora, vamos configurar seu ambiente de teste usando imagens pr\u00e9-configuradas do Kafka e do Couchbase Server. Voc\u00ea precisa instalar o Vagrant, o VirtualBox e o Ansible para configur\u00e1-los localmente. Se voc\u00ea tiver esses servi\u00e7os instalados em outro lugar, certifique-se de ajustar adequadamente os endere\u00e7os de host ao longo deste guia.<\/p>\n<pre><code class=\"language-bash\">$ cd \/tmp\/kafka-connector\/env<\/code><\/pre>\n<p>Verificar as vers\u00f5es das depend\u00eancias:<\/p>\n<pre><code class=\"language-bash\">$ ansible --version\r\n$ vboxmanage --version\r\n$ vagrant -v<\/code><\/pre>\n<p>Voc\u00ea pode atribuir nomes leg\u00edveis por humanos \u00e0s caixas usando o plug-in do Vagrant. Se voc\u00ea ainda n\u00e3o o tiver instalado, use o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">$ vagrant plugin install vagrant-hostsupdater<\/code><\/pre>\n<p>Agora voc\u00ea est\u00e1 pronto para provisionar os servidores e come\u00e7ar a trabalhar:<\/p>\n<pre><code>$ vagrant up<\/code><\/pre>\n<p>Observa\u00e7\u00e3o: se um servidor falhar na instala\u00e7\u00e3o devido a tempos limite, tente novamente \"vagrant up\" ap\u00f3s alguns minutos e talvez funcione.<\/p>\n<p>Verifique se os hosts est\u00e3o respondendo:<\/p>\n<pre><code class=\"language-bash\">$ ping couchbase1.vagrant\r\n$ ping kafka1.vagrant<\/code><\/pre>\n<p>Se voc\u00ea navegar at\u00e9 o Couchbase Server de n\u00f3 \u00fanico configurado com credenciais\u00a0<code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);\">Administrador<\/code>\/<code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);\">senha<\/code>.<\/p>\n<h2>Criando as amostras<\/h2>\n<p>Para evitar problemas de classpath, use o maven para criar um arquivo JAR aut\u00f4nomo para cada aplicativo de amostra.<\/p>\n<p>O aplicativo gerador \u00e9 um aplicativo CLI m\u00ednimo. Ele usa o SDK Java do Couchbase para agrupar as linhas de entrada do STDIN em documentos JSON e os envia para o bucket \"padr\u00e3o\" no Couchbase Server:<\/p>\n<pre><code class=\"language-bash\">$ cd \/tmp\/kafka-connector\/samples\/generator\r\n$ mvn assembly:assembly<\/code><\/pre>\n<p>O produtor se conecta ao Couchbase Server e transmite todas as muta\u00e7\u00f5es para o Kafka. Esse aplicativo usa o projeto couchbase-kafkaconnector nos bastidores.<\/p>\n<pre><code class=\"language-bash\">$ cd \/tmp\/kafka-connector\/samples\/producer\r\n$ mvn assembly:assembly<\/code><\/pre>\n<p>O consumidor \u00e9 um consumidor t\u00edpico do Kafka, que, por padr\u00e3o, apenas envia qualquer mensagem recebida no t\u00f3pico \"default\" para STDOUT.<\/p>\n<pre><code class=\"language-bash\">$ cd \/tmp\/kafka-connector\/samples\/consumer\r\n$ mvn assembly:assembly\r\n<\/code><\/pre>\n<h2>Executando as amostras<\/h2>\n<p>Agora que voc\u00ea tem tudo preparado, \u00e9 hora de executar todas as amostras. Voc\u00ea precisar\u00e1 de tr\u00eas sess\u00f5es de shell diferentes, pois cada uma delas executa um processo at\u00e9 ser interrompida. Vamos supor que voc\u00ea esteja na sess\u00e3o <span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">\/tmp\/kafka-connector\/samples<\/code><span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span>diret\u00f3rio.<\/p>\n<p>Primeiro, ligue o gerador:<\/p>\n<pre><code class=\"language-bash\">$ java -jar generator\/target\/kafka-samples-generator-1.0-SNAPSHOT-jar-with-dependencies.jar\r\n<\/code><\/pre>\n<p>Ele deve exibir as configura\u00e7\u00f5es de conex\u00e3o e, em seguida, cair em um prompt de comando<span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">&gt;<\/code>. Voc\u00ea pode digitar qualquer coisa l\u00e1 e verificar se ele est\u00e1 sendo criado corretamente, olhando na interface de administra\u00e7\u00e3o do Couchbase Server:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8157 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2016\/01\/Couchbase-and-kafka.png\" alt=\"\" width=\"1281\" height=\"648\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2016\/01\/Couchbase-and-kafka.png 1281w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2016\/01\/Couchbase-and-kafka-300x152.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2016\/01\/Couchbase-and-kafka-1024x518.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2016\/01\/Couchbase-and-kafka-768x388.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2016\/01\/Couchbase-and-kafka-20x10.png 20w\" sizes=\"auto, (max-width: 1281px) 100vw, 1281px\" \/><\/p>\n<p>Documentos do gerador no balde<\/p>\n<pre><code class=\"language-bash\">...\r\nINFO: Opened bucket default\r\n&gt; hello, kafka demo!\r\n&gt;&gt; key=key-5, value={\"line\":\"hello, kafka demo!\"}\r\n<\/code><\/pre>\n<p>Neste momento, voc\u00ea pode executar o exemplo do conector<\/p>\n<pre><code class=\"language-bash\">$ java -jar producer\/target\/kafka-samples-producer-1.0-SNAPSHOT-jar-with-dependencies.jar<\/code><\/pre>\n<p>Para cada linha digitada no gerador, voc\u00ea ver\u00e1 uma linha do produtor como esta:<\/p>\n<pre><code class=\"language-bash\">RECEIVED: com.couchbase.kafka.DCPEvent@4e44cb88<\/code><\/pre>\n<p>O exemplo o grava logo antes de enviar a carga \u00fatil para o Kafka, na implementa\u00e7\u00e3o da classe de filtro. Vamos verificar como o Kafka recebe essas mensagens.<\/p>\n<pre><code class=\"language-bash\">$ java -jar consumer\/target\/kafka-samples-consumer-1.0-SNAPSHOT-jar-with-dependencies.jar\r\n1: {\"line\":\"hello, kafka demo!\"}\r\n2: {\"line\":\"hello, this is a test\"}<\/code><\/pre>\n<p>Voc\u00ea pode continuar brincando com ele enquanto todos os tr\u00eas servi\u00e7os estiverem em execu\u00e7\u00e3o.<\/p>\n<h2>Desenvolvimento com o conector Kafka do Couchbase<\/h2>\n<p>Vamos seguir em frente e dar uma olhada no c\u00f3digo. Todos os tr\u00eas aplicativos s\u00e3o bastante amig\u00e1veis para experimentos, por exemplo, o gerador cabe em apenas algumas linhas:<\/p>\n<pre><code class=\"language-java\">public class Example {\r\n    public static void main(String args[]) throws IOException {\r\n        Random random = new Random();\r\n        Cluster cluster = CouchbaseCluster.create(\"couchbase1.vagrant\");\r\n        Bucket bucket = cluster.openBucket();\r\n        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));\r\n        String line;\r\n        do {\r\n            System.out.print(\"&gt; \");\r\n            line = input.readLine();\r\n            if (line == null) {\r\n                break;\r\n            }\r\n            String key = \"key-\" + random.nextInt(10);\r\n            JsonObject value = JsonObject.create().put(\"line\", line);\r\n            bucket.upsert(JsonDocument.create(key, value));\r\n            System.out.printf(\"&gt;&gt; key=%s, value=%sn\", key, value);\r\n        } while (true);\r\n    }\r\n}<\/code><\/pre>\n<p>Basicamente, o gerador abre uma conex\u00e3o com o bucket \"default\" em sua inst\u00e2ncia \"couchbase1.vagrant\" e grava suas mensagens em chaves aleat\u00f3rias. Voc\u00ea pode estend\u00ea-lo para enviar outros tipos de eventos. Outra coisa que voc\u00ea pode tentar fazer \u00e9 remover chaves.<\/p>\n<p>Por padr\u00e3o, o Conector do Couchbase para Kafka \u00e9 executado no modo de servidor, no qual toma emprestado o thread ativo e escuta ativamente o Couchbase Server em busca de novos eventos. H\u00e1 v\u00e1rios pontos em que voc\u00ea pode aplicar suas ideias ou altera\u00e7\u00f5es. O mais \u00f3bvio \u00e9 o construtor de configura\u00e7\u00e3o, onde voc\u00ea n\u00e3o apenas especifica as credenciais e os endere\u00e7os dos servi\u00e7os aos quais est\u00e1 se conectando, mas tamb\u00e9m pode especificar v\u00e1rias classes de serializador e filtro.<\/p>\n<p>O aplicativo de amostra implementa v\u00e1rias delas. A classe Filter \u00e9 a mais simples:<\/p>\n<pre><code class=\"language-java\">\r\npublic class SampleFilter implements Filter {\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public boolean pass(DCPEvent dcpEvent) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\"RECEIVED: \" + dcpEvent);\r\n\u00a0 \u00a0 \u00a0 \u00a0 return true;\r\n\u00a0 \u00a0 }\r\n}\r\n<\/code><\/pre>\n<p>Aqui voc\u00ea pode inserir as verifica\u00e7\u00f5es personalizadas que desejar e, se<span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">passar()<\/code><span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span>retornos <span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">falso<\/code>o conector descarta a mensagem e n\u00e3o a envia para o Kafka.<\/p>\n<p>O codificador padr\u00e3o, que vem com a distribui\u00e7\u00e3o do conector, tenta representar cada mensagem como JSON, mas isso provavelmente n\u00e3o \u00e9 o que voc\u00ea precisa, portanto, voc\u00ea pode aplicar e converter para<span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">Evento DCPE<\/code><span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span>e retorna uma matriz de bytes, que ser\u00e1 armazenada no Kafka. Neste exemplo, apenas convertemos os eventos em sua representa\u00e7\u00e3o de cadeia de caracteres.<\/p>\n<pre><code class=\"language-java\">\r\npublic class SampleEncoder extends AbstractEncoder {\r\n\u00a0 \u00a0 public SampleEncoder(final VerifiableProperties properties) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 super(properties);\r\n\u00a0 \u00a0 }\r\n\r\n\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public byte[] toBytes(final DCPEvent dcpEvent) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (dcpEvent.message() instanceof MutationMessage) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 MutationMessage message = (MutationMessage) dcpEvent.message();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return message.content().toString(CharsetUtil.UTF_8).getBytes();\r\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return dcpEvent.message().toString().getBytes();\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n}\r\n<\/code><\/pre>\n<p>Uma configura\u00e7\u00e3o mais avan\u00e7ada \u00e9<span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">StateSerializer<\/code><span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span>interface. Ao implement\u00e1-la, voc\u00ea pode controlar como a biblioteca rastrear\u00e1 os cursores de fluxo (ou seja, os n\u00fameros de sequ\u00eancia de cada parti\u00e7\u00e3o dentro do Couchbase Server) e se ela ser\u00e1 retomada ap\u00f3s a reinicializa\u00e7\u00e3o do conector. H\u00e1 uma implementa\u00e7\u00e3o do serializador de estado do Zookeeper na distribui\u00e7\u00e3o. Aqui na amostra, implementamos <code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">NullStateSerializer<\/code><span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span>que n\u00e3o persiste em nada, mas mostra uma implementa\u00e7\u00e3o m\u00ednima.<\/p>\n<pre><code class=\"language-java\">\r\npublic class NullStateSerializer implements StateSerializer {\r\n\u00a0 \u00a0 public NullStateSerializer(final CouchbaseKafkaEnvironment environment) {\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public void dump(BucketStreamAggregatorState aggregatorState) {\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public void dump(BucketStreamAggregatorState aggregatorState, short partition) {\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public BucketStreamAggregatorState load(BucketStreamAggregatorState aggregatorState) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 return new BucketStreamAggregatorState(aggregatorState.name());\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public BucketStreamState load(BucketStreamAggregatorState aggregatorState, short partition) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 return new BucketStreamState(partition, 0, 0, 0xffffffff, 0, 0xffffffff);\r\n\u00a0 \u00a0 }\r\n}\r\n<\/code><\/pre>\n<p>O \u00faltimo componente de seu cluster de demonstra\u00e7\u00e3o \u00e9 o consumidor Kafka<span style=\"color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; line-height: 25.6px; text-align: start;\">\u00a0<\/span><code style=\"box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; color: #333333; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">AbstractConsumer<\/code>que \u00e9 uma inst\u00e2ncia bastante t\u00edpica de um consumidor. Ele consiste em duas partes: A primeira, que implementa o bootstrap e o posicionamento no t\u00f3pico do Kafka, e <span style=\"color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; line-height: 21.76px; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">PrintConsumer<\/span>que carrega sua \"l\u00f3gica de neg\u00f3cios\", ou simplesmente emite todas as mensagens pelas quais passa <span style=\"color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; line-height: 21.76px; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">AbstractConsumer<\/span>:<\/p>\n<pre><code class=\"language-java\">\r\npublic class PrintConsumer extends AbstractConsumer {\r\n\u00a0 \u00a0 public PrintConsumer(String[] seedBrokers, int port) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 super(seedBrokers, port);\r\n\u00a0 \u00a0 }\r\n\r\n\r\n\u00a0 \u00a0 public PrintConsumer(String seedBroker, int port) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 super(seedBroker, port);\r\n\u00a0 \u00a0 }\r\n\r\n\r\n\u00a0 \u00a0 @Override\r\n\u00a0 \u00a0 public void handleMessage(long offset, byte[] bytes) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 System.out.println(String.valueOf(offset) + \": \" + new String(bytes));\r\n\u00a0 \u00a0 }\r\n}\r\n<\/code><\/pre>\n<p>Como nos outros exemplos aqui, voc\u00ea pode brincar com a modifica\u00e7\u00e3o do consumidor de amostra. Voc\u00ea pode at\u00e9 mesmo fechar o circuito enviando tudo de volta ao Couchbase Server. O Kafka \u00e9 um software distribu\u00eddo, assim como o Couchbase Server, portanto, tenha isso em mente ao executar em seu pr\u00f3prio cluster e ajuste a fun\u00e7\u00e3o main() de acordo. Em nossa amostra, temos apenas uma \u00fanica parti\u00e7\u00e3o, a parti\u00e7\u00e3o (<span style=\"color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; line-height: 21.76px; text-align: start; background-color: rgba(0, 0, 0, 0.0392157);\">0<\/span>) no Kafka, de modo que o nosso principal tem a seguinte apar\u00eancia:<\/p>\n<pre><code class=\"language-java\">public class Example {\r\n    public static void main(String args[]) {\r\n        PrintConsumer example = new PrintConsumer(\"kafka1.vagrant\", 9092);\r\n        example.run(\"default\", 0);\r\n    }\r\n}<\/code><\/pre>\n<p>\u00c9 claro que, em um cluster de produ\u00e7\u00e3o, voc\u00ea executar\u00e1 mais de uma parti\u00e7\u00e3o.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Espero que isso o ajude a ter um bom come\u00e7o com o Couchbase e o Kafka. Parab\u00e9ns!<\/p>","protected":false},"excerpt":{"rendered":"<p>Intro Couchbase Kafka Connector 1.2.0 just shipped. Along with the various bug fixes, there is new sample code for a Kafka consumer in addition to the Kafka producer that was previously available. To quickly review the terms: A Kafka producer [&hellip;]<\/p>","protected":false},"author":25,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[1295,1487],"ppma_author":[8995],"class_list":["post-2010","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-connectors","tag-kafka"],"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>Up &amp; Running with the Sample Kafka Consumer in 10 Minutes<\/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\/kafka-and-couchbase-up-and-running-in-10-minutes\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kafka and Couchbase: Up and Running with the Sample Kafka Consumer in 10 Minutes\" \/>\n<meta property=\"og:description\" content=\"Intro Couchbase Kafka Connector 1.2.0 just shipped. Along with the various bug fixes, there is new sample code for a Kafka consumer in addition to the Kafka producer that was previously available. To quickly review the terms: A Kafka producer [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/kafka-and-couchbase-up-and-running-in-10-minutes\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-21T19:13:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-02-03T12:33:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sergey Avseyev, SDK Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@avsej\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sergey Avseyev, SDK Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/\"},\"author\":{\"name\":\"Sergey Avseyev, SDK Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e9181374f225c90084ec3ba86bdcfa2e\"},\"headline\":\"Kafka and Couchbase: Up and Running with the Sample Kafka Consumer in 10 Minutes\",\"datePublished\":\"2016-01-21T19:13:26+00:00\",\"dateModified\":\"2020-02-03T12:33:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/\"},\"wordCount\":1013,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"connectors\",\"kafka\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/\",\"name\":\"Up & Running with the Sample Kafka Consumer in 10 Minutes\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-01-21T19:13:26+00:00\",\"dateModified\":\"2020-02-03T12:33:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#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\/kafka-and-couchbase-up-and-running-in-10-minutes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kafka and Couchbase: Up and Running with the Sample Kafka Consumer in 10 Minutes\"}]},{\"@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\/e9181374f225c90084ec3ba86bdcfa2e\",\"name\":\"Sergey Avseyev, SDK Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/796ab283bd56fe3716a102ebe16daff6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/288a892d231cf8c4e57ed0643e4681b4654a141361f6ec3c5b79ccd4d885e038?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/288a892d231cf8c4e57ed0643e4681b4654a141361f6ec3c5b79ccd4d885e038?s=96&d=mm&r=g\",\"caption\":\"Sergey Avseyev, SDK Engineer, Couchbase\"},\"description\":\"Sergey Avseyev is a SDK Engineer at Couchbase. Sergey Avseyev is responsible for development of Kafka connector, and underlying library, which implements DCP, Couchbase replication protocol. Also maintaining PHP SDK for Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/avsej\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/sergey-avseyev\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Up & Running with the Sample Kafka Consumer in 10 Minutes","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\/kafka-and-couchbase-up-and-running-in-10-minutes\/","og_locale":"pt_BR","og_type":"article","og_title":"Kafka and Couchbase: Up and Running with the Sample Kafka Consumer in 10 Minutes","og_description":"Intro Couchbase Kafka Connector 1.2.0 just shipped. Along with the various bug fixes, there is new sample code for a Kafka consumer in addition to the Kafka producer that was previously available. To quickly review the terms: A Kafka producer [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/kafka-and-couchbase-up-and-running-in-10-minutes\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-01-21T19:13:26+00:00","article_modified_time":"2020-02-03T12:33:05+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Sergey Avseyev, SDK Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@avsej","twitter_misc":{"Written by":"Sergey Avseyev, SDK Engineer, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/"},"author":{"name":"Sergey Avseyev, SDK Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e9181374f225c90084ec3ba86bdcfa2e"},"headline":"Kafka and Couchbase: Up and Running with the Sample Kafka Consumer in 10 Minutes","datePublished":"2016-01-21T19:13:26+00:00","dateModified":"2020-02-03T12:33:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/"},"wordCount":1013,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["connectors","kafka"],"articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/","url":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/","name":"Up & Running with the Sample Kafka Consumer in 10 Minutes","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-01-21T19:13:26+00:00","dateModified":"2020-02-03T12:33:05+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/kafka-and-couchbase-up-and-running-in-10-minutes\/#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\/kafka-and-couchbase-up-and-running-in-10-minutes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kafka and Couchbase: Up and Running with the Sample Kafka Consumer in 10 Minutes"}]},{"@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\/e9181374f225c90084ec3ba86bdcfa2e","name":"Sergey Avseyev, engenheiro de SDK, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/796ab283bd56fe3716a102ebe16daff6","url":"https:\/\/secure.gravatar.com\/avatar\/288a892d231cf8c4e57ed0643e4681b4654a141361f6ec3c5b79ccd4d885e038?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/288a892d231cf8c4e57ed0643e4681b4654a141361f6ec3c5b79ccd4d885e038?s=96&d=mm&r=g","caption":"Sergey Avseyev, SDK Engineer, Couchbase"},"description":"Sergey Avseyev \u00e9 engenheiro de SDK na Couchbase. Sergey Avseyev \u00e9 respons\u00e1vel pelo desenvolvimento do conector Kafka e da biblioteca subjacente, que implementa o DCP, o protocolo de replica\u00e7\u00e3o do Couchbase. Tamb\u00e9m mant\u00e9m o PHP SDK para o Couchbase.","sameAs":["https:\/\/x.com\/avsej"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/sergey-avseyev\/"}]}},"authors":[{"term_id":8995,"user_id":25,"is_guest":0,"slug":"sergey-avseyev","display_name":"Sergey Avseyev, SDK Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/288a892d231cf8c4e57ed0643e4681b4654a141361f6ec3c5b79ccd4d885e038?s=96&d=mm&r=g","author_category":"","last_name":"Avseyev, SDK Engineer, Couchbase","first_name":"Sergey","job_title":"","user_url":"","description":"Sergey Avseyev \u00e9 engenheiro de SDK na Couchbase. Sergey Avseyev \u00e9 respons\u00e1vel pelo desenvolvimento do conector Kafka e da biblioteca subjacente, que implementa o DCP, o protocolo de replica\u00e7\u00e3o do Couchbase. Tamb\u00e9m mant\u00e9m o PHP SDK para o Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2010","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\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2010"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2010\/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=2010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2010"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}