{"id":2750,"date":"2021-07-12T12:07:25","date_gmt":"2021-07-12T15:07:25","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=2750"},"modified":"2024-01-16T15:06:30","modified_gmt":"2024-01-16T18:06:30","slug":"superando-o-desafio-de-sincronizar-dados-com-change-vectors","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/","title":{"rendered":"AP-E Superando o desafio de sincronizar dados com Change Vectors"},"content":{"rendered":"<strong>Sistemas distribu\u00eddos lidam constantemente com o desafio de sincronizar dados de processos.<\/strong> N\u00e3o raro, v\u00ea-se adotar estrat\u00e9gias ing\u00eanuas como a adi\u00e7\u00e3o de campos com registro de datas de \u00faltima modifica\u00e7\u00e3o que falham frente a problemas de sincroniza\u00e7\u00e3o de rel\u00f3gio ou gest\u00e3o de concorr\u00eancia para m\u00faltiplos reposit\u00f3rios.\n<hr \/>\n<p>Uma abordagem consistente para sincroniza\u00e7\u00e3o de dados em diversos reposit\u00f3rios, com suporte melhorado para gest\u00e3o de conflitos e concorr\u00eancia, \u00e9 a ado\u00e7\u00e3o de uma vers\u00e3o adaptada de <em>Vector Clocks<\/em>, uma estrutura de dados para sequenciamento de eventos,\u00a0chamada<em> Change Vectors<\/em>.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Change Vector no RavenDB<\/p>\r\n<\/p>\n<p><em>Change Vector<\/em> \u00e9 a estrutura de dados adotada pelo RavenDB como fundamento para controlar gest\u00e3o de dados sincronizados em bases de dados distribu\u00eddas, onde todos as inst\u00e2ncias operam como <em>Master<\/em>.<\/p>\n<p><\/div>\n<p>A l\u00f3gica essencial \u00e9 a seguinte:<\/p>\n<ul>\n<li>Todos os reposit\u00f3rios que ir\u00e3o armazenar dados sincronizados recebem um <em>id\u00a0<\/em>\u00fanico e imut\u00e1vel.<\/li>\n<li>Todas as tuplas para dados armazenados incluem um campo especial para o\u00a0<em>change vector.<\/em><\/li>\n<li>Quando uma nova tupla \u00e9 criada, o campo dedicado ao <em>change vector\u00a0<\/em>recebe uma entrada com a chave correspondendo ao\u00a0<em>id<\/em> do reposit\u00f3rio e um valor de contagens iniciado em 1.<\/li>\n<li>Toda vez que uma tupla \u00e9 atualizada, o change vector tem o valor da entrada correspondente ao <em>id\u00a0<\/em>do reposit\u00f3rio incrementado em uma unidade.<\/li>\n<\/ul>\n<hr \/>\n<p>Um mecanismo de sincroniza\u00e7\u00e3o pode usar, ent\u00e3o, a informa\u00e7\u00e3o do\u00a0<em>change vector\u00a0<\/em>para determinar qual vers\u00e3o da <em>tupla<\/em> \u00e9 mais atualizada, executando a replica\u00e7\u00e3o.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"size-full wp-image-2752 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/change_vector_2.png\" alt=\"\" width=\"588\" height=\"233\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/change_vector_2.png 588w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/change_vector_2-300x119.png 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/p>\n<p>As regras essenciais de compara\u00e7\u00e3o entre dois\u00a0<em>change vectors\u00a0<\/em>s\u00e3o:<\/p>\n<ul>\n<li>S\u00e3o iguais se, e somente se, todas as entradas, nos dois <em>change vectors<\/em>,\u00a0 tiverem valores iguais para todos os <em>ids<\/em> (<em>ids\u00a0<\/em>n\u00e3o relacionados tem valor l\u00f3gico zero)<\/li>\n<li>Um\u00a0<em>change vector A\u00a0<\/em>\u00e9 maior que um\u00a0<em>change vector B<\/em> se, e somente se, todos os valores forem maiores ou iguais entre os\u00a0<em>ids\u00a0<\/em>de reposit\u00f3rio correspondentes.<\/li>\n<li>Um\u00a0<em>change vector A<\/em> conflita com um <em>change vector B<\/em> se, e somente se, pelo menos um dos valores de A for maior ou igual ao correspondente B e pelo menos um dos valores de B for maior ou igual ao correspondente A.<\/li>\n<\/ul>\n<hr \/>\n<p><img decoding=\"async\" class=\"size-full wp-image-2755 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/change_vector_3.png\" alt=\"\" width=\"588\" height=\"249\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/change_vector_3.png 588w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/change_vector_3-300x127.png 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/p>\n<p>Na ocorr\u00eancia de um conflito, alguma estrat\u00e9gia de resolu\u00e7\u00e3o precisa ser adotada, geralmente customizada pela natureza da pr\u00f3pria tupla, geralmente, para isso, poder\u00e1 ser recuperada a vers\u00e3o ancestral de todas as tuplas conflitantes, al\u00e9m da vers\u00e3o dessas tuplas.<\/p>\n<p>As chances de conflitos reduzem bastante quando altera\u00e7\u00f5es em uma tupla acontecem preferencialmente em um \u00fanico reposit\u00f3rio, bem como, quando as compara\u00e7\u00f5es forem mais frequentes.<\/p>\n<p>Eventualmente, os pr\u00f3prios reposit\u00f3rios podem manter\u00a0<em>change vectors\u00a0<\/em>globais para compara\u00e7\u00e3o r\u00e1pida e determinar &#8220;sentido de atualiza\u00e7\u00e3o&#8221;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"featured_media":2757,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[73],"apendices":[48],"capitulos":[],"class_list":["post-2750","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-x-apendice","apendices-apendice-e"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>AP-E Superando o desafio de sincronizar dados com Change Vectors - Manual do Arquiteto de Software<\/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:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AP-E Superando o desafio de sincronizar dados com Change Vectors - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Uma abordagem consistente para sincroniza\u00e7\u00e3o de dados em diversos reposit\u00f3rios, com suporte melhorado para gest\u00e3o de conflitos e concorr\u00eancia, \u00e9 a ado\u00e7\u00e3o de uma vers\u00e3o adaptada de Vector Clocks, uma estrutura de dados para sequenciamento de eventos,\u00a0chamada Change Vectors. A l\u00f3gica essencial \u00e9 a seguinte: Todos os reposit\u00f3rios que ir\u00e3o armazenar dados sincronizados recebem um [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-16T18:06:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/\",\"name\":\"AP-E Superando o desafio de sincronizar dados com Change Vectors - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg\",\"datePublished\":\"2021-07-12T15:07:25+00:00\",\"dateModified\":\"2024-01-16T18:06:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg\",\"width\":1024,\"height\":576},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"AP-E Superando o desafio de sincronizar dados com Change Vectors\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AP-E Superando o desafio de sincronizar dados com Change Vectors - Manual do Arquiteto de Software","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:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/","og_locale":"pt_BR","og_type":"article","og_title":"AP-E Superando o desafio de sincronizar dados com Change Vectors - Manual do Arquiteto de Software","og_description":"Uma abordagem consistente para sincroniza\u00e7\u00e3o de dados em diversos reposit\u00f3rios, com suporte melhorado para gest\u00e3o de conflitos e concorr\u00eancia, \u00e9 a ado\u00e7\u00e3o de uma vers\u00e3o adaptada de Vector Clocks, uma estrutura de dados para sequenciamento de eventos,\u00a0chamada Change Vectors. A l\u00f3gica essencial \u00e9 a seguinte: Todos os reposit\u00f3rios que ir\u00e3o armazenar dados sincronizados recebem um [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-16T18:06:30+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/","name":"AP-E Superando o desafio de sincronizar dados com Change Vectors - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg","datePublished":"2021-07-12T15:07:25+00:00","dateModified":"2024-01-16T18:06:30+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/vincent-branciforti-XK4-50GdQ7M-unsplash.jpg","width":1024,"height":576},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/superando-o-desafio-de-sincronizar-dados-com-change-vectors\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"AP-E Superando o desafio de sincronizar dados com Change Vectors"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/2750","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=2750"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/2757"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=2750"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=2750"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=2750"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=2750"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=2750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}