{"id":1835,"date":"2014-12-16T17:37:33","date_gmt":"2014-12-16T17:37:32","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1835"},"modified":"2017-04-19T13:59:17","modified_gmt":"2017-04-19T20:59:17","slug":"why-membase-uses-erlang","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/why-membase-uses-erlang\/","title":{"rendered":"Por que o Membase usa Erlang"},"content":{"rendered":"<p>Cada vez com menos frequ\u00eancia (porque o Erlang est\u00e1 se tornando mais popular), perguntam-me por que o Membase escolheu usar <a href=\"https:\/\/www.erlang.org\/\">Erlang<\/a> para nosso componente de gerenciamento de cluster e supervis\u00e3o de processos. As alternativas mais comuns sugeridas s\u00e3o Java, C++, <a href=\"https:\/\/python.org\">Python<\/a>, <a href=\"https:\/\/ruby-lang.org\">Rubi<\/a>e, mais recentemente, <a href=\"https:\/\/nodejs.org\/\">node.js<\/a> e <a href=\"https:\/\/clojure.org\/\">Clojure<\/a> (que seria minha principal escolha se o Erlang estivesse fora dos meus limites).<\/p>\n<p>Certamente h\u00e1 muitas desvantagens no uso do Erlang. Em primeiro lugar, \u00e9 necess\u00e1rio criar, empacotar e dar suporte a outro ambiente de tempo de execu\u00e7\u00e3o - dependemos do sistema Python no Linux e no OS X e usamos <a href=\"https:\/\/www.py2exe.org\/\">py2exe<\/a> para criar execut\u00e1veis para o Windows, mas na verdade criamos e empacotamos o Erlang. Com o Java, poder\u00edamos depender do fato de o sistema j\u00e1 ter o Java instalado, o que \u00e9 um pouco mais dif\u00edcil no Linux, mas mais f\u00e1cil no Windows. Al\u00e9m disso, eventualmente precisaremos de um tempo de execu\u00e7\u00e3o Java para poder executar m\u00f3dulos Java NodeCode.<\/p>\n<p>Al\u00e9m disso, nem tantos programadores conhecem Erlang quanto Java ou C++ ou, de fato, qualquer uma das alternativas poss\u00edveis que mencionei. Sua sintaxe e sua sem\u00e2ntica s\u00e3o incomuns, considerando sua <a href=\"https:\/\/en.wikipedia.org\/wiki\/Prolog\">Prolog<\/a> A natureza funcional, concorrente e pragm\u00e1tica de Erlang e o fato de ser uma linguagem pragm\u00e1tica que vem sendo usada e evoluindo desde 1986. Isso n\u00e3o chegou a ser um problema para a equipe de engenharia da Membase - quatro de n\u00f3s podem trabalhar nos componentes Erlang, e o c\u00f3digo Erlang \u00e9 pequeno o suficiente para que possa ser facilmente mantido por qualquer um de n\u00f3s. No entanto, isso definitivamente eleva o n\u00edvel de exig\u00eancia para que nossos pr\u00f3prios desenvolvedores e colaboradores da comunidade possam contribuir com o subsistema de gerenciamento de cluster se ainda n\u00e3o conhecerem Erlang.<\/p>\n<p>Vale muito a pena. O Erlang (na verdade, Erlang\/OTP, que \u00e9 o que a maioria das pessoas quer dizer quando falam \"Erlang tem X\") faz muitas coisas que ter\u00edamos que construir do zero ou tentar juntar as bibliotecas existentes para fazer. Suas <a href=\"https:\/\/learnyousomeerlang.com\/types-or-lack-thereof\">sistema de tipos din\u00e2micos<\/a> e <a href=\"https:\/\/erlang.org\/doc\/reference_manual\/expressions.html#pattern\">correspond\u00eancia de padr\u00f5es<\/a> (ala <a href=\"https:\/\/www.haskell.org\/\">Haskell<\/a> e ML) fazem com que o c\u00f3digo Erlang tenda a ser ainda mais conciso do que Python e Ruby, duas linguagens conhecidas por sua capacidade de fazer muito em poucas linhas de c\u00f3digo.<\/p>\n<p>Para n\u00f3s, a maior vantagem de usar Erlang deve ser seu suporte integrado para <a href=\"https:\/\/ulf.wiger.net\/weblog\/2008\/02\/06\/what-is-erlang-style-concurrency\/\">concorr\u00eancia<\/a>. Erlang modela tarefas simult\u00e2neas como \"<a href=\"https:\/\/www.erlang.org\/doc\/reference_manual\/processes.html\">processos<\/a>\" que podem se comunicar entre si apenas por meio de passagem de mensagens (que faz uso de correspond\u00eancia de padr\u00f5es!), no que \u00e9 conhecido como <a href=\"https:\/\/en.wikipedia.org\/wiki\/Actor_model\">modelo de ator<\/a> de concorr\u00eancia. Isso, por si s\u00f3, torna completamente imposs\u00edvel toda uma classe de bugs relacionados \u00e0 simultaneidade. Embora isso <a href=\"https:\/\/james-iry.blogspot.com\/2009\/04\/erlang-style-actors-are-all-about_16.html\">n\u00e3o impede completamente o impasse<\/a>Se voc\u00ea escrever o c\u00f3digo dessa forma, ser\u00e1 muito dif\u00edcil n\u00e3o perceber um cen\u00e1rio de deadlock em potencial. Embora seja certamente <a href=\"https:\/\/stackoverflow.com\/questions\/22187\/erlang-style-concurrency-for-other-languages\">poss\u00edvel<\/a> para implementar o modelo de ator na maioria, se n\u00e3o em todos, os ambientes alternativos que mencionei e, de fato, essas implementa\u00e7\u00f5es existem, mas s\u00e3o incompletas ou sofrem de uma incompatibilidade de imped\u00e2ncia com as bibliotecas existentes que esperam que voc\u00ea use threads.<\/p>\n<p>Os processos Erlang, al\u00e9m de serem isolados uns dos outros, s\u00e3o muito leves. \u00c9 poss\u00edvel executar facilmente um quarto de milh\u00e3o deles em uma \u00fanica VM Erlang. O custo de ger\u00e1-los tamb\u00e9m \u00e9 bastante baixo, o que torna desnecess\u00e1rios hacks bobos para reutiliz\u00e1-los. Como eles s\u00e3o executados no mesmo espa\u00e7o de mem\u00f3ria e s\u00e3o isolados apenas por software, a passagem de mensagens entre eles \u00e9 extremamente r\u00e1pida e, embora envolva a c\u00f3pia dos dados na mensagem na maioria das vezes, as mensagens tendem a ser pequenas e isso permite que os processos Erlang sejam coletados independentemente.<\/p>\n<p>O OTP organiza os processos em uma \"\u00e1rvore de supervis\u00e3o\", na qual os processos supervisores monitoram os processos filhos, que tamb\u00e9m podem ser supervisores, e os reiniciam e, potencialmente, qualquer processo dependente, caso eles falhem. Juntamente com o isolamento de processos, isso torna os aplicativos Erlang extremamente tolerantes a falhas: qualquer processo Erlang dentro do nosso subsistema de gerenciamento de cluster (que n\u00e3o seja o supervisor raiz) pode falhar sem derrubar o Membase. Na verdade, usamos isso muito bem: quando acontecem coisas inesperadas em qualquer um dos nossos processos, geralmente deixamos que eles simplesmente travem e reiniciem, trazendo-os de volta a um estado bom conhecido. Por exemplo, o processo que gerencia a conex\u00e3o administrativa com o processo local do memcached simplesmente ser\u00e1 interrompido se a conex\u00e3o atingir o tempo limite ou retornar qualquer erro que n\u00e3o seja esperado. Isso faz com que o tratamento de erros seja exatamente igual ao da inicializa\u00e7\u00e3o, o que deixa menos lugares para os bugs se esconderem e facilita os testes.<\/p>\n<p>Para facilitar a estrutura\u00e7\u00e3o de um aplicativo complexo como um conjunto de processos que interagem, o Erlang\/OTP fornece um conjunto padr\u00e3o de \"<a href=\"https:\/\/www.erlang.org\/doc\/design_principles\/des_princ.html#id60487\">comportamentos<\/a>\" que os m\u00f3dulos podem implementar. O mais comum deles \u00e9 <a href=\"https:\/\/www.erlang.org\/doc\/man\/gen_server.html\">gen_servidor<\/a>O comportamento gen\u00e9rico do servidor, que implementa um servidor b\u00e1sico com retornos de chamada para solicita\u00e7\u00f5es. <a href=\"https:\/\/www.erlang.org\/doc\/design_principles\/fsm.html\">Gen_fsm<\/a> implementa uma m\u00e1quina de estado finito, e <a href=\"https:\/\/www.erlang.org\/doc\/design_principles\/events.html\">gen_event<\/a> serve para implementar manipuladores de eventos e gerenciadores de eventos.<\/p>\n<p>As mensagens em Erlang podem ser enviadas t\u00e3o facilmente para um processo que reside em outro n\u00f3 quanto para processos no mesmo n\u00f3; isso \u00e9 totalmente transparente para o programador. O Erlang\/OTP tem v\u00e1rios m\u00f3dulos que ajudam no processamento distribu\u00eddo. Por exemplo, o m\u00f3dulo \"global\" fornece um registro comum de nomes e bloqueios globais, semelhante ao gerenciador de bloqueios Chubby do Google. Os \"aplicativos distribu\u00eddos\" do OTP fornecem uma maneira de garantir que um determinado conjunto de processos seja iniciado somente em um n\u00f3. O Mnesia \u00e9 um DBMS distribu\u00eddo com fortes garantias de consist\u00eancia que usamos para armazenar estat\u00edsticas.<\/p>\n<p>O Erlang oferece excelente suporte para depura\u00e7\u00e3o e aplica\u00e7\u00e3o de patches em sistemas ativos. Afinal de contas, ele foi inventado para criar sistemas com cinco noves de tempo de atividade. Se voc\u00ea conhece o cookie criptogr\u00e1fico que os n\u00f3s usam para se autenticarem uns aos outros, \u00e9 trivial anexar outro n\u00f3 Erlang ao cluster e executar comandos arbitr\u00e1rios em qualquer outro n\u00f3, inclusive \"recarregar este m\u00f3dulo\". Esse tipo de recurso \u00e9 inestim\u00e1vel quando voc\u00ea precisa corrigir ou contornar um bug e n\u00e3o pode derrubar um cluster ou mesmo um \u00fanico n\u00f3 para substituir o c\u00f3digo. Tamb\u00e9m \u00e9 inestim\u00e1vel para testes ou para qualquer situa\u00e7\u00e3o em que n\u00f3s (ou um cliente) desejemos fazer altera\u00e7\u00f5es no estado do cluster que ainda n\u00e3o tenham sido implementadas na API REST.<\/p>\n<p>No final das contas, a verdadeira quest\u00e3o n\u00e3o \u00e9 se teria sido poss\u00edvel implementar o gerenciamento de clusters em outra linguagem; \u00e9 realmente uma quest\u00e3o de esfor\u00e7o e capacidade de manuten\u00e7\u00e3o do resultado. Em qualquer outro ambiente, ter\u00edamos que reimplementar pelo menos parte do que o Erlang\/OTP oferece, embora n\u00e3o tenhamos nos deparado com a reimplementa\u00e7\u00e3o de recursos oferecidos por nenhum outro ambiente.<\/p>","protected":false},"excerpt":{"rendered":"<p>Less and less often (because Erlang is becoming more popular), I\u2019m asked why Membase chose to use Erlang for our cluster management and process supervision component. Common alternatives people suggest are Java, C++, Python, Ruby, and, more recently, node.js and [&hellip;]<\/p>","protected":false},"author":12,"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":[],"ppma_author":[8985],"class_list":["post-1835","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Why Membase Uses Erlang - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/why-membase-uses-erlang\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Why Membase Uses Erlang\" \/>\n<meta property=\"og:description\" content=\"Less and less often (because Erlang is becoming more popular), I\u2019m asked why Membase chose to use Erlang for our cluster management and process supervision component. Common alternatives people suggest are Java, C++, Python, Ruby, and, more recently, node.js and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/why-membase-uses-erlang\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T17:37:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-19T20:59:17+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=\"Sean Lynch\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sean Lynch\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/\"},\"author\":{\"name\":\"Sean Lynch\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/74f9c611ecff848513c56c0140eb31cd\"},\"headline\":\"Why Membase Uses Erlang\",\"datePublished\":\"2014-12-16T17:37:32+00:00\",\"dateModified\":\"2017-04-19T20:59:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/\"},\"wordCount\":1096,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/\",\"name\":\"Why Membase Uses Erlang - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T17:37:32+00:00\",\"dateModified\":\"2017-04-19T20:59:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#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\/why-membase-uses-erlang\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Why Membase Uses Erlang\"}]},{\"@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\/74f9c611ecff848513c56c0140eb31cd\",\"name\":\"Sean Lynch\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/abc8717cc349562a1fac7cd7e3e5e73c\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/123867b09e058a0cb2e2feee0f87f8bf263115c19fb7f6260f1cdb39ecc45f4d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/123867b09e058a0cb2e2feee0f87f8bf263115c19fb7f6260f1cdb39ecc45f4d?s=96&d=mm&r=g\",\"caption\":\"Sean Lynch\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/sean-lynch\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Why Membase Uses Erlang - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/why-membase-uses-erlang\/","og_locale":"pt_BR","og_type":"article","og_title":"Why Membase Uses Erlang","og_description":"Less and less often (because Erlang is becoming more popular), I\u2019m asked why Membase chose to use Erlang for our cluster management and process supervision component. Common alternatives people suggest are Java, C++, Python, Ruby, and, more recently, node.js and [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/why-membase-uses-erlang\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T17:37:32+00:00","article_modified_time":"2017-04-19T20:59:17+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":"Sean Lynch","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Sean Lynch","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/"},"author":{"name":"Sean Lynch","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/74f9c611ecff848513c56c0140eb31cd"},"headline":"Why Membase Uses Erlang","datePublished":"2014-12-16T17:37:32+00:00","dateModified":"2017-04-19T20:59:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/"},"wordCount":1096,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/","url":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/","name":"Why Membase Uses Erlang - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T17:37:32+00:00","dateModified":"2017-04-19T20:59:17+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/why-membase-uses-erlang\/#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\/why-membase-uses-erlang\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Why Membase Uses Erlang"}]},{"@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\/74f9c611ecff848513c56c0140eb31cd","name":"Sean Lynch","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/abc8717cc349562a1fac7cd7e3e5e73c","url":"https:\/\/secure.gravatar.com\/avatar\/123867b09e058a0cb2e2feee0f87f8bf263115c19fb7f6260f1cdb39ecc45f4d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/123867b09e058a0cb2e2feee0f87f8bf263115c19fb7f6260f1cdb39ecc45f4d?s=96&d=mm&r=g","caption":"Sean Lynch"},"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/sean-lynch\/"}]}},"authors":[{"term_id":8985,"user_id":12,"is_guest":0,"slug":"sean-lynch","display_name":"Sean Lynch","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/123867b09e058a0cb2e2feee0f87f8bf263115c19fb7f6260f1cdb39ecc45f4d?s=96&d=mm&r=g","author_category":"","last_name":"Lynch","first_name":"Sean","job_title":"","user_url":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1835","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\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1835"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1835\/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=1835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1835"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}