{"id":7085,"date":"2019-06-18T08:03:34","date_gmt":"2019-06-18T15:03:34","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7085"},"modified":"2023-05-19T04:35:50","modified_gmt":"2023-05-19T11:35:50","slug":"couchbase-scala-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-scala-sdk\/","title":{"rendered":"Apresentando o SDK do Couchbase Scala"},"content":{"rendered":"<p>Estou muito feliz em informar que o Couchbase agora tem um SDK Scala compat\u00edvel, permitindo que voc\u00ea obtenha e busque documentos, execute consultas N1QL, fa\u00e7a an\u00e1lises e pesquisas de texto completo - tudo com Scala nativo.<\/p>\n<p>Neste blog, abordarei os principais recursos e princ\u00edpios de design do Scala SDK.  Ou, se voc\u00ea quiser come\u00e7ar imediatamente, d\u00ea uma olhada no <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/start-using-sdk.html\">guia de introdu\u00e7\u00e3o aqui<\/a>.  O Scala SDK est\u00e1 dispon\u00edvel para download agora mesmo, em uma vers\u00e3o alfa de pr\u00e9-lan\u00e7amento.<\/p>\n<p>O Scala SDK usa o mesmo n\u00facleo interno est\u00e1vel e de alto desempenho do novo Java SDK 3.x, portanto, embora seja novo, voc\u00ea pode ter certeza de que estar\u00e1 pronto para a produ\u00e7\u00e3o no GA.<\/p>\n<h3><b>Tratamento funcional de erros - sem exce\u00e7\u00f5es!<\/b><\/h3>\n<p>O SDK do Scala apresenta uma interface funcional, com a maioria das opera\u00e7\u00f5es retornando um Scala Try.  Ele pode ser um Success e conter o valor esperado, ou um Failure contendo um Throwable. Embora a princ\u00edpio isso pare\u00e7a um pouco prolixo e exija alguma disciplina de programa\u00e7\u00e3o para sempre tratar os erros, essa forma de tratamento de erros rapidamente se torna uma segunda natureza e permite que voc\u00ea desenvolva com seguran\u00e7a, sabendo que uma exce\u00e7\u00e3o aleat\u00f3ria n\u00e3o ser\u00e1 lan\u00e7ada pelo SDK.<\/p>\n<p>Aqui est\u00e1 uma demonstra\u00e7\u00e3o simples de como inserir um documento:<\/p>\n<pre class=\"lang:scala decode:true\">val json = JsonObject(\"status\" -&gt; \"awesome!\")\r\n\r\nval result: Try[MutationResult] = collection.insert(\"document-key\", json)<\/pre>\n<p>E, em seguida, a correspond\u00eancia de padr\u00f5es no resultado do Try:<\/p>\n<pre class=\"lang:scala decode:true\">result match {\r\n \u00a0\u00a0\u00a0 case Success(mr) =&gt; println(\"Upsert was successful\")\r\n \u00a0\u00a0\u00a0 case Failure(err: KeyAlreadyExistsException) =&gt; println(\"document-key already exists\") \r\n \u00a0\u00a0\u00a0 case Failure(err) =&gt; println(\"Error: \" + err)\r\n}<\/pre>\n<p>(\u00c9 claro que um aplicativo de produ\u00e7\u00e3o trataria os erros adequadamente, em vez de usar apenas println!)<\/p>\n<p>Se voc\u00ea preferir algo semelhante ao Java SDK, que lan\u00e7a exce\u00e7\u00f5es, isso \u00e9 f\u00e1cil de simular, bastando chamar .get() em qualquer Try, que ser\u00e1 lan\u00e7ado se for uma falha:<\/p>\n<pre class=\"lang:scala decode:true\">val result: MutationResult = collection.insert(\"document-key\", json).get()<\/pre>\n<p>\u00c9 f\u00e1cil combinar v\u00e1rios Trys por meio do flatMap.  Aqui, inserimos um documento, depois o obtemos, recuperamos seu conte\u00fado convertido na biblioteca JSON integrada JsonObjectSafe (falaremos mais sobre isso posteriormente) e, por fim, obtemos um campo chamado \"status\" a partir dele.  Tudo isso em um estilo totalmente funcional, de modo que, por exemplo, a opera\u00e7\u00e3o get s\u00f3 ser\u00e1 tentada se o upsert for bem-sucedido.<\/p>\n<pre class=\"lang:scala decode:true\">val result: Try[String] = collection.upsert(\"document-key\", json)\r\n    .flatMap(_ =&gt; collection.get(\"document-key\"))\r\n    .flatMap(_.contentAs[JsonObjectSafe])\r\n    .flatMap(_.str(\"status\"))\r\n\r\nresult match {\r\n    case Success(status) =&gt; println(s\"Couchbase is $status\")\r\n    case Failure(err) =&gt;\u00a0\u00a0\u00a0 println(\"Error: \" + err)\r\n}<\/pre>\n<p>(Para fins de concis\u00e3o, a maioria dos exemplos abaixo deixar\u00e1 de lado a verifica\u00e7\u00e3o do resultado.  Mas os aplicativos de produ\u00e7\u00e3o devem, \u00e9 claro, ABC - sempre estar verificando).<\/p>\n<h3><b>Vis\u00e3o de futuro<\/b><\/h3>\n<p>Imediatamente, o SDK \u00e9 compat\u00edvel com a nova durabilidade mais forte que estar\u00e1 dispon\u00edvel no Couchbase Server 6.5:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json, durability = Durability.Majority)<\/pre>\n<p>E oferece suporte a cole\u00e7\u00f5es, um novo m\u00e9todo de organiza\u00e7\u00e3o de documentos dentro de compartimentos que ser\u00e1 um recurso fundamental de uma vers\u00e3o futura do Couchbase Server (com uma visualiza\u00e7\u00e3o em breve).  Em breve, o usu\u00e1rio poder\u00e1 criar algumas cole\u00e7\u00f5es de brinquedo para brincar, mas, por enquanto, ser\u00e1 suficiente abrir a cole\u00e7\u00e3o padr\u00e3o:<\/p>\n<pre class=\"lang:scala decode:true\">val cluster = Cluster.connect(\"cluster-ip\", \"username\", \"password\")\r\nval collection = cluster.bucket(\"bucket-name\").defaultCollection<\/pre>\n<p>Essa l\u00f3gica funcionar\u00e1 em todas as vers\u00f5es compat\u00edveis do Couchbase Server (5.x e superior).<\/p>\n<p>Al\u00e9m disso, est\u00e1 inclu\u00eddo o suporte ao OpenTracing (agora OpenTelemetry), a plataforma que est\u00e1 se tornando o padr\u00e3o de fato para o rastreamento de sistemas distribu\u00eddos complexos:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json, parentSpan = Some(mySpan))<\/pre>\n<h3><b>API simples<\/b><\/h3>\n<p>O SDK utiliza par\u00e2metros nomeados e padr\u00e3o em vez de sobrecargas, de modo que seu c\u00f3digo pode ser t\u00e3o simples quanto:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json)<\/pre>\n<p>ou conforme personalizado:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json, durability = Durability.Majority, expiration = 60.minutes, parentSpan = Some(mySpan))<\/pre>\n<p>como voc\u00ea precisa que seja.<\/p>\n<h3><b>Ass\u00edncrono<\/b><\/h3>\n<p>Assim como o Java SDK, s\u00e3o apresentadas tr\u00eas APIs, o que lhe d\u00e1 flexibilidade para estruturar seu aplicativo da maneira que precisar.<\/p>\n<p>A primeira \u00e9 a API s\u00edncrona de bloqueio simples que voc\u00ea viu nos exemplos acima.  Essa pode ser uma boa op\u00e7\u00e3o padr\u00e3o, mas \u00e9 claro que exige que voc\u00ea gerencie explicitamente seu pr\u00f3prio threading, se necess\u00e1rio.<\/p>\n<p>A segunda \u00e9 aquela criada com base na programa\u00e7\u00e3o reativa, usando tipos reativos padr\u00e3o (Mono e Flux) do Project Reactor.<\/p>\n<p>Um exemplo de upserting de forma reativa:<\/p>\n<pre class=\"lang:scala decode:true\">val mono: Mono[MutationResult] = collection.reactive.upsert(\"document-key\", json)\r\n    .doOnError(err =&gt; println(s\"Error during upsert: ${err}\"))\r\n    .doOnNext(mutationResult =&gt; println(\"Success\"))<\/pre>\n<p>Com a programa\u00e7\u00e3o reativa, nada acontecer\u00e1 at\u00e9 que assinemos o Mono.  A maneira mais simples de fazer isso para fins de teste \u00e9 usar block(), embora essa seja uma pr\u00e1tica ruim para um aplicativo real:<\/p>\n<pre class=\"lang:scala decode:true\">val result: MutationResult = mono.block()<\/pre>\n<p>A programa\u00e7\u00e3o reativa \u00e9 um assunto complexo e profundo que n\u00e3o posso abordar muito aqui, mas, quando dominada, \u00e9 uma ferramenta poderosa, especialmente para lidar com as complexidades dos sistemas distribu\u00eddos do mundo real.  Em particular, a API reativa oferece contrapress\u00e3o em consultas N1QL, FTS e anal\u00edticas; portanto, se o aplicativo estiver com dificuldades para acompanhar os dados, ele reduzir\u00e1 automaticamente o consumo de linhas e evitar\u00e1 erros de falta de mem\u00f3ria.  Incentivo os curiosos a dar uma olhada na <a href=\"https:\/\/projectreactor.io\/docs\">Documenta\u00e7\u00e3o do Project Reactor<\/a> para saber mais.<\/p>\n<p>Por fim, h\u00e1 a API ass\u00edncrona criada com base no Scala Futures, que fornece um pouco do gerenciamento de threads e da capacidade de composi\u00e7\u00e3o da programa\u00e7\u00e3o reativa, mas em uma forma mais familiar para muitos desenvolvedores do Scala.  Um exemplo simples de upsert tem a seguinte apar\u00eancia:<\/p>\n<pre class=\"lang:default decode:true\">val result: Future[MutationResult] = collection.async.upsert(\"document-key\", json)\r\n\r\nresult onComplete {\r\n    case Success(_) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 =&gt; println(\"Successfully upserted\")\r\n    case Failure(exception) =&gt; println(\"Error: \" + exception)\r\n}<\/pre>\n<h3><b>Flexibilidade do JSON<\/b><\/h3>\n<p>Um dos principais objetivos era n\u00e3o prender voc\u00ea a nenhuma implementa\u00e7\u00e3o JSON espec\u00edfica e, pronto para uso, o Scala SDK funcionar\u00e1 bem com v\u00e1rias bibliotecas Scala JSON populares, incluindo Circe, \u00b5Pickle \/ \u00b5Json, Json4s e Jawn.  Voc\u00ea pode ver trechos de como usar cada uma delas em <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/howtos\/json.html\">os documentos JSON<\/a>Mas, para abrir seu apetite, aqui est\u00e1 um pouco do Circe em a\u00e7\u00e3o - observe como os tipos do Circe s\u00e3o enviados e retornados diretamente do SDK:<\/p>\n<pre class=\"lang:scala decode:true\">import io.circe.generic.auto._\r\nimport io.circe.syntax._\r\n\r\nval user = User(\u201cJohn Smith\u201d, 29)\r\nval json: io.circe.Json = user.asJson\r\n\r\nval result: Try[io.circe.Json] = collection.insert(\"id\", json)\r\n    .flatMap(_ =&gt; collection.get(\"id\"))\r\n     .flatMap(doc =&gt; doc.contentAs[io.circe.Json])\r\n\r\nresult match {\r\n    case Success(content: io.circe.Json) =&gt;\r\n        \/\/ Handle Circe Json here\r\n    case Failure(err) =&gt;\u00a0\u00a0\u00a0 println(\"Error: \" + err)\r\n}<\/pre>\n<h4>JSON incorporado<\/h4>\n<p>Adotando uma abordagem de \"baterias inclu\u00eddas\", h\u00e1 tamb\u00e9m uma biblioteca JSON simples inclu\u00edda no SDK, a JsonObject.  Seus principais objetivos s\u00e3o:<\/p>\n<ul>\n<li>Conveni\u00eancia. Nem todo mundo quer avaliar v\u00e1rias bibliotecas JSON antes de come\u00e7ar. O JsonObject \u00e9 uma op\u00e7\u00e3o padr\u00e3o decente.<\/li>\n<li>Velocidade. Nosso benchmarking interno (<a href=\"https:\/\/github.com\/couchbase\/couchbase-jvm-clients\/tree\/master\/benchmarks\">fonte<\/a> caso queira execut\u00e1-los voc\u00ea mesmo) indica que o JsonObject pode ser at\u00e9 20 vezes mais r\u00e1pido do que a biblioteca Scala JSON mais pr\u00f3xima em algumas opera\u00e7\u00f5es importantes. Ele consegue isso principalmente por ser constru\u00eddo em torno de estruturas de dados JVM simples, mas muito r\u00e1pidas e mut\u00e1veis.<\/li>\n<li>Flexibilidade.  A interface padr\u00e3o JsonObject lan\u00e7a exce\u00e7\u00f5es (o \u00fanico lugar no SDK que faz isso).  Ou voc\u00ea pode facilmente convert\u00ea-la em uma JsonObjectSafe, que fornece uma interface funcional baseada em tentativas.<\/li>\n<li>Facilidade de uso e mutabilidade. Estamos de acordo com<a href=\"https:\/\/www.lihaoyi.com\/post\/uJsonfastflexibleandintuitiveJSONforScala.html\"> o autor de \u00b5Json<\/a> que, embora a imutabilidade seja geralmente desej\u00e1vel, nem sempre \u00e9 a melhor op\u00e7\u00e3o no caso espec\u00edfico do JSON. Lidar com JSON profundamente aninhado requer ferramentas funcionais, como lentes, que raramente s\u00e3o f\u00e1ceis de ler e usar, sem mencionar o fato de que possivelmente incorrem em uma penalidade de desempenho. E o JSON \u00e9, na maioria das vezes, tratado de forma breve e em um escopo limitado (por exemplo, obter e modificar um documento), portanto, raramente se beneficia da seguran\u00e7a da imutabilidade. Portanto, o JsonObject apresenta uma API mut\u00e1vel simples.<\/li>\n<\/ul>\n<p>Voc\u00ea pode se aprofundar no <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/howtos\/json.html#jsonobject-and-jsonarray\">Documentos sobre JsonObject aqui<\/a>.  \u00c9 claro que, se voc\u00ea preferir uma biblioteca JSON mais \"tipicamente Scala\" com dados imut\u00e1veis, tipos de dados alg\u00e9bricos, lentes, cursores e outros recursos funcionais, ent\u00e3o uma das outras bibliotecas suportadas pode ser uma escolha melhor - a escolha \u00e9 sua, e voc\u00ea pode facilmente misturar e combinar v\u00e1rias bibliotecas JSON no mesmo aplicativo.<\/p>\n<h4><b>Suporte direto \u00e0 classe de casos<\/b><\/h4>\n<p>Embora o SDK do Scala tenha um \u00f3timo suporte para JSON, \u00e0s vezes \u00e9 mais f\u00e1cil e prefer\u00edvel trabalhar diretamente com as classes de caso do Scala.<\/p>\n<p>Basta adicionar essa pequena parte do boilerplate \u00e0 sua classe de caso para que o SDK possa gerar automaticamente a l\u00f3gica de serializa\u00e7\u00e3o:<\/p>\n<pre class=\"lang:scala decode:true\">case class User(name: String, age: Int)\r\n\r\nobject User {\r\n    implicit val codec: Codec[User] = Codecs.codec[User]\r\n}<\/pre>\n<p>E ent\u00e3o voc\u00ea pode facilmente enviar essa classe de caso diretamente para o SDK e receb\u00ea-la de volta:<\/p>\n<pre class=\"lang:default decode:true\">val r: Try[User] = collection.insert(\u201cdocId\u201d, User(\u201cJohn Smith\u201d, 29))\r\n    .flatMap(_ =&gt; collection.get(\u201cdocId\u201d)\r\n    .flatMap(doc =&gt; doc.contentAs[User])<\/pre>\n<p>Por tr\u00e1s disso, isso \u00e9 convertido e armazenado no Couchbase Server como o JSON que voc\u00ea espera:<\/p>\n<pre class=\"lang:default decode:true\">{\"name\":\"John Smith\",\"age\":29}<\/pre>\n<p>Trata-se de um JSON simples e comum, sem metadados extras de serializa\u00e7\u00e3o ou similares, de modo que pode ser escrito livremente como uma classe de caso e lido em uma biblioteca JSON ou por outro SDK, ou vice-versa.<\/p>\n<p>Confira o <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/howtos\/json.html#case-classes\">documenta\u00e7\u00e3o sobre o uso de classes de casos<\/a> para saber mais.<\/p>\n<h3><b>Consultas f\u00e1ceis<\/b><\/h3>\n<p>Facilitamos ao m\u00e1ximo o uso do Couchbase Analytics, N1QL e Full Text Search.  Aqui est\u00e1 um exemplo de uma consulta N1QL em que as linhas s\u00e3o convertidas em JsonObject.<\/p>\n<pre class=\"lang:default decode:true\">cluster.query(\"\"\"select * from `travel-sample` limit 10;\"\"\")\r\n    .flatMap(_.allRowsAs[JsonObject]) match {\r\n\r\n    case Success(rows: Seq[JsonObject]) =&gt;\r\n        rows.foreach(row =&gt; println(row))\r\n    case Failure(err) =&gt;\r\n        println(s\"Error: $err\")\r\n}<\/pre>\n<p>E, \u00e9 claro, \u00e9 poss\u00edvel obter esses resultados como qualquer um dos tipos de JSON suportados acima ou diretamente como classes de caso do Scala.<\/p>\n<p>E, conforme mencionado acima, o uso da API reativa significa que voc\u00ea obt\u00e9m a contrapress\u00e3o autom\u00e1tica gratuitamente, garantindo que seu aplicativo consuma linhas em uma taxa gerenci\u00e1vel e n\u00e3o tenha problemas de falta de mem\u00f3ria em consultas muito grandes.<\/p>\n<p>&nbsp;<\/p>\n<p>Se voc\u00ea est\u00e1 animado para come\u00e7ar a usar o SDK do Couchbase Scala, confira o <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/start-using-sdk.html\">guia de in\u00edcio r\u00e1pido<\/a>.  Ele est\u00e1 dispon\u00edvel agora mesmo, embora em uma forma alfa inicial.  Pode haver algumas mudan\u00e7as significativas antes de ir para o GA, mas, por outro lado, este \u00e9 o momento perfeito para experiment\u00e1-lo e nos dar seu feedback, deixando um coment\u00e1rio abaixo ou enviando-o para <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">Nossos f\u00f3runs<\/a>, <a href=\"https:\/\/twitter.com\/couchbase\">Twitter<\/a> ou <a href=\"https:\/\/gitter.im\/couchbase\/discuss?source=orgpage\">gitter<\/a>.  Nada \u00e9 definitivo e agradecemos a chance de fazer algumas altera\u00e7\u00f5es e tornar este SDK o melhor poss\u00edvel.<\/p>","protected":false},"excerpt":{"rendered":"<p>I\u2019m very happy to report that Couchbase now has a supported Scala SDK, allowing you to get and fetch documents, run N1QL queries, perform analytics and full text search lookups &#8211; all with native Scala. In this blog I\u2019m going [&hellip;]<\/p>","protected":false},"author":40102,"featured_media":7088,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2201],"tags":[],"ppma_author":[9084],"class_list":["post-7085","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tools-sdks"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing the Couchbase Scala SDK - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.\" \/>\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\/couchbase-scala-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the Couchbase Scala SDK\" \/>\n<meta property=\"og:description\" content=\"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-scala-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-18T15:03:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-19T11:35:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/06\/scala_and_couchbase.png\" \/>\n\t<meta property=\"og:image:width\" content=\"666\" \/>\n\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Graham Pople, Senior Software Engineer, 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=\"Graham Pople, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\"},\"author\":{\"name\":\"Graham Pople, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/40b3fd994e3f33a8068e54e36577eb8e\"},\"headline\":\"Introducing the Couchbase Scala SDK\",\"datePublished\":\"2019-06-18T15:03:34+00:00\",\"dateModified\":\"2023-05-19T11:35:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\"},\"wordCount\":1417,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"articleSection\":[\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\",\"name\":\"Introducing the Couchbase Scala SDK - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"datePublished\":\"2019-06-18T15:03:34+00:00\",\"dateModified\":\"2023-05-19T11:35:50+00:00\",\"description\":\"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"width\":666,\"height\":350},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the Couchbase Scala SDK\"}]},{\"@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\/40b3fd994e3f33a8068e54e36577eb8e\",\"name\":\"Graham Pople, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d0840b7ec045a43a30d21b57fa29318b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g\",\"caption\":\"Graham Pople, Senior Software Engineer, Couchbase\"},\"description\":\"Graham is a senior software engineer at Couchbase who works on the SDK and Connectors team, mainly on the Scala and Java clients. Make his day by asking him about home composting.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/grahamp\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing the Couchbase Scala SDK - The Couchbase Blog","description":"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.","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\/couchbase-scala-sdk\/","og_locale":"pt_BR","og_type":"article","og_title":"Introducing the Couchbase Scala SDK","og_description":"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-scala-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-06-18T15:03:34+00:00","article_modified_time":"2023-05-19T11:35:50+00:00","og_image":[{"width":666,"height":350,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/06\/scala_and_couchbase.png","type":"image\/png"}],"author":"Graham Pople, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Graham Pople, Senior Software Engineer, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/"},"author":{"name":"Graham Pople, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/40b3fd994e3f33a8068e54e36577eb8e"},"headline":"Introducing the Couchbase Scala SDK","datePublished":"2019-06-18T15:03:34+00:00","dateModified":"2023-05-19T11:35:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/"},"wordCount":1417,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","articleSection":["Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/","name":"Introducing the Couchbase Scala SDK - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","datePublished":"2019-06-18T15:03:34+00:00","dateModified":"2023-05-19T11:35:50+00:00","description":"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","width":666,"height":350},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing the Couchbase Scala SDK"}]},{"@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\/40b3fd994e3f33a8068e54e36577eb8e","name":"Graham Pople, engenheiro de software s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d0840b7ec045a43a30d21b57fa29318b","url":"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g","caption":"Graham Pople, Senior Software Engineer, Couchbase"},"description":"Graham is a senior software engineer at Couchbase who works on the SDK and Connectors team, mainly on the Scala and Java clients. Make his day by asking him about home composting.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/grahamp\/"}]}},"authors":[{"term_id":9084,"user_id":40102,"is_guest":0,"slug":"grahamp","display_name":"Graham Pople, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g","author_category":"","last_name":"Pople, Senior Software Engineer, Couchbase","first_name":"Graham","job_title":"","user_url":"","description":"Graham \u00e9 um engenheiro de software s\u00eanior da Couchbase que trabalha na equipe de SDK e conectores, principalmente nos clientes Scala e Java.  Fa\u00e7a com que ele ganhe o dia perguntando sobre compostagem dom\u00e9stica."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7085","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\/40102"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=7085"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7085\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/7088"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=7085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=7085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=7085"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=7085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}