{"id":3541,"date":"2022-06-30T14:59:17","date_gmt":"2022-06-30T17:59:17","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=3541"},"modified":"2024-01-12T18:16:15","modified_gmt":"2024-01-12T21:16:15","slug":"fundamentos-para-arquiteturas-baseadas-em-servicos","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/","title":{"rendered":"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os"},"content":{"rendered":"<p><strong><span style=\"color: #ff0000;\">&#8212; Este cap\u00edtulo ainda carece de edi\u00e7\u00e3o e conex\u00e3o apropriada entre os t\u00f3picos. Aprecie com modera\u00e7\u00e3o.<\/span><\/strong><\/p>\n<strong>Um dos grandes desafios da arquitetura de software \u00e9 decompor sistemas em unidades modulares pequenas, com conjuntos bem delimitados de responsabilidades.<\/strong> <em>Service-oriented computing<\/em> representa uma estrat\u00e9gia para supera\u00e7\u00e3o desse desafio.\n<hr \/>\n<p>De forma ampla, abordagens\u00a0<em>service-oriented <\/em>implicam em &#8220;perceber&#8221; sistemas complexos como conjunto de <strong><span style=\"text-decoration: underline;\">servi\u00e7os<\/span>, cada um deles atendendo um conjunto bem claro de atividades de neg\u00f3cio ou demandas t\u00e9cnicas, sempre orientadas a um determinado\u00a0<em>outcome<\/em>.<\/strong><\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <\/p>\n<p><em>Um servi\u00e7o implementa uma cole\u00e7\u00e3o de capabilities.<\/em><\/p>\n<p>\r\n<p><strong>Thomas Erl<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Todo servi\u00e7o deve ser, dentro do poss\u00edvel, <\/strong><em><strong>self-contained<\/strong> &#8211;\u00a0<\/em>ou seja, com condi\u00e7\u00f5es de cumprir suas atribui\u00e7\u00f5es de maneira independente &#8211; sem depender de outros. Al\u00e9m disso, devem operar em\u00a0<em>black-box<\/em>, tornando detalhes de implementa\u00e7\u00e3o e funcionamento irrelevantes para eventuais consumidores.<\/p>\n<p><strong>Eventualmente, servi\u00e7os podem &#8220;combinar&#8221; funcionalidades de outros servi\u00e7os<\/strong> de forma a atender plenamente objetivos de neg\u00f3cio, respeitando restri\u00e7\u00f5es e atributos de qualidade.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> <\/p>\n<p>Muitas das ideias indicadas para SOA s\u00e3o plenamente aplic\u00e1veis com microsservi\u00e7os. As principais distin\u00e7\u00f5es est\u00e3o na forma como a comunica\u00e7\u00e3o \u00e9 implementada (em SOA, tradicionalmente, recorre-se a um barramento para orquestra\u00e7\u00e3o) e na granularidade (cada microsservi\u00e7o, idealmente, realiza uma\u00a0<em>capability).<\/em><\/p>\n<p><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Organiza\u00e7\u00f5es com seus sistemas organizados a partir de arquiteturas <em>service-oriented<\/em>, mant\u00e9m r\u00edgidos processos de governan\u00e7a, partindo de um invent\u00e1rio.<\/strong><\/p>\n<h2>Elementos fundamentais em SOA<\/h2>\n<p>Ao projetar sistemas com SOA, cabe ao arquiteto considerar, em primeiro n\u00edvel, segregar componentes de software em quatro categorias.<\/p>\n<ol>\n<li><strong><em>Frontend<\/em><\/strong> &#8211; contendo tanto as interfaces com usu\u00e1rios quanto APIs externas;<\/li>\n<li><strong><em>Services Repository<\/em><\/strong> ou Invent\u00e1rio &#8211; contendo uma rela\u00e7\u00e3o organizada e estrutura dos servi\u00e7os, bem como seus contratos e interfaces;<\/li>\n<li><em><strong>Service Bus<\/strong>\u00a0<\/em>&#8211; como principal elemento de comunica\u00e7\u00e3o e orquestra\u00e7\u00e3o<\/li>\n<li><strong><em>Services<\/em><\/strong>, podendo ser implementa\u00e7\u00f5es finais ou composi\u00e7\u00f5es de servi\u00e7os.<\/li>\n<\/ol>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Em n\u00edvel mais alto, arquiteturas <em>service-oriented<\/em> s\u00e3o tecnicamente particionadas.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<strong>Interessante observar que SOA abre espa\u00e7o para forma\u00e7\u00e3o de, pelo menos, quatro frentes de trabalho dentro das organiza\u00e7\u00f5es.<\/strong> N\u00e3o \u00e9 raro, por exemplo, a forma\u00e7\u00e3o de <em>squads\u00a0<\/em>inteiros voltados ao relacionamento com usu\u00e1rios internos e externos, atrav\u00e9s dos <em>frontends <\/em>e servi\u00e7os de &#8220;experi\u00eancia&#8221;. Tamb\u00e9m n\u00e3o \u00e9 raro o estabelecimento de times inteiros arquitetando e implementando &#8220;integra\u00e7\u00f5es&#8221; (<em>integration architects <\/em>operando barramento e o invent\u00e1rio).\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Em empresas maiores, \u00e9 comum implementar governan\u00e7a a partir do invent\u00e1rio de servi\u00e7os.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Para cada servi\u00e7o, por sua vez, \u00e9 importante ponderar sobre:<\/p>\n<ol>\n<li><em><strong>contract<\/strong> &#8211;\u00a0<\/em>estabelecendo como um servi\u00e7o pode ser consumido, com detalhes t\u00e9cnicos e indica\u00e7\u00e3o de restri\u00e7\u00f5es e requisitos, geralmente descritos em conjuntos de documentos como (<em>WSDL, XSD e WS-Policy<\/em>)<\/li>\n<li><em><strong>implementation<\/strong> &#8211;\u00a0<\/em>contendo o c\u00f3digo, propriamente dito, do servi\u00e7o.<\/li>\n<li><strong><em>interface <\/em><\/strong>&#8211; realizando elementos especificados em contrato.<\/li>\n<\/ol>\n<hr \/>\n<p>\u00c9 na implementa\u00e7\u00e3o dos servi\u00e7os que reside a <strong>l\u00f3gica de neg\u00f3cio<\/strong> e a <strong>persist\u00eancia<\/strong>.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Idealmente, o projeto de servi\u00e7o deve ser particionado por crit\u00e9rios do dom\u00ednio.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Alguns princ\u00edpios arquiteturais\u00a0para SOA<\/h2>\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Defini\u00e7\u00e3o: Princ\u00edpio arquitetural<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><\/p>\n<p>Um princ\u00edpio arquitetural \u00e9 uma pr\u00e1tica generalizada e aceita. Trata-se n\u00e3o somente de recomenda\u00e7\u00f5es adotadas por outros, mas amplamente defendidas.<\/p>\n<p>Princ\u00edpios s\u00e3o <em>guidelines <\/em>contendo recomenda\u00e7\u00f5es que direcionam para a elabora\u00e7\u00e3o de solu\u00e7\u00f5es com determinados objetivos explicitamente definidos.<\/p>\n<p><\/p>\r\n<\/div>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Thomas_Erl\">Thomas Erl<\/a>, uma das grandes refer\u00eancias em projetos de arquiteturas baseadas em servi\u00e7os (SOA), ensina que h\u00e1 oito princ\u00edpios fundamentais a observar sempre que estivermos projetando sistemas nesse estilo.<\/p>\n<ol>\n<li><strong>O <em>design<\/em> deve ser orientado a contratos coerentemente padronizados<\/strong>, ou seja, todos os servi\u00e7os dentro de um mesmo invent\u00e1rio devem estar em conformidade com um mesmo conjunto de padr\u00f5es de projeto. Os contratos dos servi\u00e7os devem ser sempre fornecidos com seu respectivo servi\u00e7o, compreendendo especifica\u00e7\u00e3o t\u00e9cnica e\/ou documentos descritivos formais. Essa padroniza\u00e7\u00e3o pode ser desafiadora para ambientes com muitos servi\u00e7os, ao longo do tempo.<\/li>\n<li><strong>Servi\u00e7os devem ter baixo acoplamento entre eles<\/strong>, atrav\u00e9s de contratos, que n\u00e3o revelem nem dependam de aspectos internos de implementa\u00e7\u00e3o, como tecnologias adotadas e padr\u00f5es de armazenamento.<\/li>\n<li><strong>Qualquer informa\u00e7\u00e3o n\u00e3o essencial de um servi\u00e7o deve ser abstra\u00edda<\/strong>, atrav\u00e9s de uma classifica\u00e7\u00e3o criteriosa de propriedades expostas;<\/li>\n<li><strong>Servi\u00e7os devem ser projetados para reuso<\/strong>, ou seja, de forma a atender diferentes contextos de utiliza\u00e7\u00e3o, n\u00e3o relacionados intimamente a processos ou atividades espec\u00edficas;<\/li>\n<li><strong>Servi\u00e7os devem ser\u00a0<\/strong><b>aut\u00f4nomos<\/b>, ou seja, devem ter influ\u00eancia principal dos ambientes de execu\u00e7\u00e3o onde operam;<\/li>\n<li><strong>Servi\u00e7os devem minimizar gest\u00e3o de estado<\/strong>, reduzindo a demenda de gest\u00e3o por recursos de persist\u00eancia, transferindo a gest\u00e3o do estado para aplica\u00e7\u00f5es clientes sempre que aplic\u00e1vel.<\/li>\n<li><strong>Servi\u00e7os devem ser &#8220;descobr\u00edveis&#8221;, <\/strong>expostos atrav\u00e9s de um registro central (invent\u00e1rio)<\/li>\n<li><strong>Servi\u00e7os devem ser compon\u00edveis,\u00a0<\/strong>por exemplo, pela ado\u00e7\u00e3o da estrat\u00e9gia\u00a0<em>funcionalidade -&gt; processo -&gt; Experi\u00eancia<\/em><\/li>\n<\/ol>\n<h2>Classifica\u00e7\u00f5es para segrega\u00e7\u00e3o de responsabilidades em servi\u00e7os<\/h2>\n<p>H\u00e1 duas abordagens amplas, interessantes, a adotar quando se est\u00e1 segregando responsabilidades de um sistema em servi\u00e7os.<\/p>\n<p>A primeira, proposta por Thomas Erl, consiste na separa\u00e7\u00e3o de servi\u00e7os em:<\/p>\n<ul>\n<li><em><strong>Task Services<\/strong> &#8211; <\/em>implementando\u00a0atividades diretamente relacionadas a processos de neg\u00f3cio &#8211; como processamento de uma venda.<\/li>\n<li><strong><em>Entity Services\u00a0<\/em><\/strong>&#8211; que &#8220;digitalizam&#8221; membros do modelo de neg\u00f3cios, tais como informa\u00e7\u00f5es relacionadas a clientes, contratos, pedidos, etc<\/li>\n<li><em><strong>Utility Services<\/strong>\u00a0<\/em>&#8211; importantes para automa\u00e7\u00f5es, n\u00e3o necessariamente implementando aspectos relacionados ao neg\u00f3cio, mas <em>concerns<\/em> t\u00e9cnicos, como transforma\u00e7\u00e3o de dados e integra\u00e7\u00e3o entre sistemas.<\/li>\n<\/ul>\n<hr \/>\n<p>No modelo proposto por Erl,\u00a0<em>task services\u00a0<\/em>operam em uma primeira camada, combinando\u00a0<em>entity services <\/em>de uma segunda camada que, por sua vez, combinam,\u00a0<em>utility services.<\/em><\/p>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-contribuicao-2\">\r\n<p style=\"font-size: 22px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">The Entity Services Antipattern<\/p>\r\nMichael Nygard considera, modernamente, <em>entity services <\/em>como um antipattern. Nesse artigo, apresenta suas justificativas e aponta algumas implica\u00e7\u00f5es da ado\u00e7\u00e3o dessa estrat\u00e9gia de modulariza\u00e7\u00e3o.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/www.michaelnygard.com\/blog\/2017\/12\/the-entity-service-antipattern\/\" target=\"_blank\" rel=\"noopener\">Acessar<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>A segunda abordagem (API-Led), proposta pela MuleSoft, consiste na separa\u00e7\u00e3o de servi\u00e7os em:<\/p>\n<ul>\n<li><em><strong>Experience Services\u00a0<\/strong><\/em>&#8211; composi\u00e7\u00f5es de diversos <em>process services<\/em>, visando tangibilizar uma\u00a0&#8220;experi\u00eancia&#8221;, como, por exemplo &#8220;efetivar uma compra&#8221;<\/li>\n<li><em><strong>Process Services\u00a0<\/strong><\/em>&#8211; composi\u00e7\u00f5es de diversos\u00a0<em>system services\u00a0<\/em>, visando consolidar sequ\u00eancias de atividades de neg\u00f3cio, como, &#8220;cadastrar um cliente&#8221;, &#8220;separar um produto&#8221;, etc.<\/li>\n<li><em><strong>System Services\u00a0<\/strong><\/em>&#8211; expondo fun\u00e7\u00f5es de base de diversos sistemas (como APIs de sistemas de ERP e CRMs) ou expondo (como transforma\u00e7\u00f5es de dados).<\/li>\n<\/ul>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Abordagens API-led parecem mais aderentes a cen\u00e1rios modernos.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Composi\u00e7\u00e3o interna de um servi\u00e7o<\/h2>\n<p>A estrutura interna dos servi\u00e7os em arquiteturas particionadas pelo dom\u00ednio costuma ter uma <em>fa\u00e7ade<\/em>, l\u00f3gica de neg\u00f3cios e o modelo de persist\u00eancia.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1825 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/servicos_internamente.png\" alt=\"\" width=\"430\" height=\"270\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/servicos_internamente.png 1174w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/servicos_internamente-300x188.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/servicos_internamente-1024x642.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/servicos_internamente-768x481.png 768w\" sizes=\"(max-width: 430px) 100vw, 430px\" \/><\/p>\n<p>Eventualmente, cada servi\u00e7o poder\u00e1 ser estruturado seguindo o modelo hexagonal, proposto por Alistair Cockburn (a imagem abaixo foi extra\u00edda do site de Cockburn).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1826 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/Hexagonal-architecture-basic-1.gif\" alt=\"\" width=\"358\" height=\"239\" \/><\/p>\n<p>Para servi\u00e7os maiores e mais complexos, pode ser interessante, estruturar, decompor, internamente, o servi\u00e7o em componentes isolados abrindo margem para implementa\u00e7\u00f5es futuras baseadas em microsservi\u00e7os.<\/p>\n<h2>O &#8220;lado <em>Conway<\/em>&#8221; de SOA<\/h2>\nA arquitetura de um software, muito al\u00e9m dos aspectos t\u00e9cnicos, impacta na din\u00e2mica de trabalho das equipes que o desenvolvem. <strong>Boas arquiteturas minimizam os esfor\u00e7os de coordena\u00e7\u00e3o e sincroniza\u00e7\u00e3o entre pessoas e times, colaborando para\u00a0<em>lead times\u00a0<\/em>menores, sem comprometer a qualidade interna.<\/strong>\n<hr \/>\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;\">Revisitando 'Arquitetura' e o 'Papel do Arquiteto'<\/p>\r\n<\/p>\n<p>A arquitetura de um software tem rela\u00e7\u00e3o com as decis\u00f5es de\u00a0<em>design\u00a0<\/em>que contribuem para os objetivos do neg\u00f3cio, respeitando restri\u00e7\u00f5es e atingindo atributos de qualidade.<\/p>\n<p>O projeto da arquitetura vai determinar quais ser\u00e3o os componentes de uma aplica\u00e7\u00e3o, as responsabilidades de cada um desses componentes e a forma como se relacionam, al\u00e9m da estrat\u00e9gia de evolu\u00e7\u00e3o, sempre perseguindo\u00a0<em>evolvability.\u00a0<\/em><\/p>\n<p>Por implica\u00e7\u00f5es da lei de\u00a0<em>Conway,\u00a0<\/em>a arquitetura do software \u00e9 diretamente impactada pelas organiza\u00e7\u00f5es dos times, e vice-versa. Logo, a arquitetura tem implica\u00e7\u00f5es diretas sobre as demandas de coordena\u00e7\u00e3o e sincroniza\u00e7\u00e3o e, indiretamente, pela efici\u00eancia operacional.<\/p>\n<p>O arquiteto de software, evidentemente, precisa ser sens\u00edvel a todas essas implica\u00e7\u00f5es e desenvolver habilidades para ponderar em dimens\u00f5es que, evidentemente, extrapolam tecnologia.<\/p>\n<p><\/div>\nImportante ter clareza que mesmo arquiteturas modulares, se inadequadamente planejadas, n\u00e3o autorizam trabalho paralelo. <strong>Arquiteturas tecnicamente particionadas, por exemplo, s\u00e3o mais restritivas do que aquelas particionadas por caracter\u00edsticas do dom\u00ednio. SOA destaca-se por fazer bom equil\u00edbrio entre particionamento t\u00e9cnico e por caracter\u00edsticas do dom\u00ednio.<\/strong>\n<hr \/>\n<p>Em arquiteturas tecnicamente particionadas, quando h\u00e1 um time dedicado para cada componente t\u00e9cnico, todos os limites de componentes se convertem em &#8220;pontos de coordena\u00e7\u00e3o&#8221;. O impacto mais percept\u00edvel ocorre na amplia\u00e7\u00e3o dos <em>lead-times<\/em>. Al\u00e9m disso, quando os times s\u00e3o organizados por <em>features,<\/em> h\u00e1 &#8220;difus\u00e3o de responsabilidade&#8221; e queda da qualidade interna que ocasiona, tamb\u00e9m, no longo prazo, preju\u00edzo de <em>lead-time.<\/em><\/p>\nSistemas com arquiteturas particionadas tecnicamente, como em implementa\u00e7\u00f5es mais simples do estilo em camadas, s\u00e3o adequadas para times pequenos, com no m\u00e1ximo 20 pessoas. Em times maiores, arquiteturas precisam ser particionadas pelo dom\u00ednio para serem sustent\u00e1veis. Essa \u00e9 uma das justificativas para desenvolver arquiteturas baseadas em servi\u00e7os.\n<hr \/>\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;\">Two-pizzas rule<\/p>\r\n<br \/>\n<strong>Jeff Bezos, fundador da Amazon, argumentou que o n\u00famero ideal de membros em um time \u00e9 aquele onde todos possam ser alimentados com duas pizzas &#8211; geralmente, sete pessoas.<\/strong> Esse posicionamento ficou conhecido como &#8220;The two pizzas rule&#8221;.<\/p>\n<hr \/>\n<p><strong>Times pequenos apresentam menos desafios para comunica\u00e7\u00e3o, reduzindo tamb\u00e9m problemas de coordena\u00e7\u00e3o e sincroniza\u00e7\u00e3o.<\/strong> Em uma arquitetura em quatro camadas, tradicional, com um time respons\u00e1vel por cada camada, ter\u00edamos ent\u00e3o um limite razo\u00e1vel de 30 pessoas &#8211; mas geralmente esse n\u00famero seria menor, n\u00e3o mais do que 20, afinal, as &#8220;aloca\u00e7\u00f5es&#8221; na gest\u00e3o do banco, por exemplo, pelo seu alto acoplamento aferente s\u00e3o menores. No mesmo modelo em camadas, uma tentativa de separar times por contexto delimitado, sem &#8220;colapsar&#8221; o c\u00f3digo, restringe o n\u00famero de times a, no m\u00e1ximo, tr\u00eas (~20 pessoas).<br \/>\n<\/div>\n<h4>SOA como &#8220;ant\u00eddoto&#8221; para a difus\u00e3o de responsabilidades<\/h4>\n<strong>Desenvolver software \u00e9 um &#8220;esporte coletivo&#8221; e qualquer atividade em grupo tem demandas de coordena\u00e7\u00e3o.<\/strong> Quanto mais desenvolvedores tocam am um trecho de c\u00f3digo, maiores s\u00e3o as chances de que este c\u00f3digo tenha defeitos e, al\u00e9m disso, maiores s\u00e3o os custos operacionais de gest\u00e3o. <strong>Quanto maior o n\u00famero de envolvidos, mais importantes, frequentes e custosas s\u00e3o atividades de comunica\u00e7\u00e3o e de coordena\u00e7\u00e3o.\u00a0<\/strong>Analogamente, mais difusa \u00e9 a responsabilidade pela qualidade.\n<hr \/>\n<p>De forma objetiva, um bom\u00a0<em>proxy\u00a0<\/em>para a difus\u00e3o de responsabilidade pode ser obtido pela concentra\u00e7\u00e3o de contribui\u00e7\u00f5es (<em>commits<\/em>) de diversos autores em um determinado artefato, como indicado na f\u00f3rmula abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1764 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/difusao_responsabilidade.png\" alt=\"\" width=\"589\" height=\"111\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/difusao_responsabilidade.png 883w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/difusao_responsabilidade-300x56.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/difusao_responsabilidade-768x144.png 768w\" sizes=\"(max-width: 589px) 100vw, 589px\" \/><\/p>\n<p>Na f\u00f3rmula\u00a0<em>a<sub>i<\/sub><\/em> se refere a cada autor individualmente, <em>nc(a<sub>i<\/sub>)<\/em>\u00a0 \u00e9 o n\u00famero de contribui\u00e7\u00f5es para um determinado autor e, finalmente,\u00a0<em>NC\u00a0<\/em>\u00e9 o n\u00famero total de contribui\u00e7\u00f5es. Artefatos mantidos por um \u00fanico autor tem difus\u00e3o de responsabilidade zerada.<\/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;\">Git como 'rede social'<\/p>\r\n<\/p>\n<p><strong>Ferramentas modernas de controle de vers\u00e3o s\u00e3o frequentemente usadas apenas como mecanismos sofisticados de <em>backup\u00a0<\/em>de c\u00f3digo-fonte. Entretanto, podem ser bem mais do que isso.<\/strong><\/p>\n<hr \/>\n<p>O Git, por exemplo, consegue apontar arquivos que s\u00e3o modificados com mais frequ\u00eancia, colaboradores mais ativos, al\u00e9m, \u00e9 claro, par\u00e2metros para c\u00e1lculo da difus\u00e3o de responsabilidade. A instru\u00e7\u00e3o <code>'git shortlog -s'<\/code>, por exemplo, relaciona a quantidade de <i>commits\u00a0<\/i>, por desenvolvedor, em uma determinada pasta.<br \/>\n<\/div>\n<p><strong>Artefatos com indicadores altos de difus\u00e3o de responsabilidade geralmente apresentam qualidade interna mais baixa.<\/strong> A regra geral predominante parece ser &#8220;o que \u00e9 responsabilidade de todos, n\u00e3o \u00e9 de ningu\u00e9m&#8221;. No fim, adapta\u00e7\u00f5es acabam sendo implantadas de maneira descuidada causando problemas em produ\u00e7\u00e3o.<\/p>\nCuriosamente, artefatos com maior difus\u00e3o de responsabilidade costumam ser, tamb\u00e9m, aqueles que tem maior acoplamento eferente e que, por isso, quebram com mais facilidade, ou com maior acoplamento aferente, com potencial para gerar preju\u00edzos maiores no sistema, caso apresentem defeito.\n<hr \/>\n<strong>Arquiteturas particionadas por dom\u00ednio tendem a ter artefatos com difus\u00e3o de responsabilidade mais baixa.<\/strong> Artefatos com difus\u00e3o de responsabilidade mais baixa tendem a ser mais f\u00e1ceis de manter e evoluir, o que converte essa m\u00e9trica em uma boa <em>fitness function.<\/em>\n<hr \/>\n<p><strong>Times de engenharia que mant\u00e9m sistemas SOA costumam operar de forma concisa com contratos bem definidos no invent\u00e1rio.<\/strong><\/p>\n<h4>Propriedade sobre artefatos<\/h4>\n<p>A atribui\u00e7\u00e3o de &#8220;propriedade&#8221; para artefatos de um software &#8211; como documenta\u00e7\u00e3o, c\u00f3digo, banco de dados, etc &#8211; \u00e9 um tema controverso.\u00a0Muitas pessoas associam &#8220;propriedade&#8221; como justificativa para redu\u00e7\u00e3o da colabora\u00e7\u00e3o ou, pior ainda, forma\u00e7\u00e3o de silos. Entretanto, esse n\u00e3o \u00e9 o ponto! <strong>A atribui\u00e7\u00e3o de &#8220;propriedade&#8221; \u00e9 uma medida para tentar minimizar os efeitos da difus\u00e3o de responsabilidades.\u00a0<\/strong><\/p>\n<p>Atribuir &#8220;propriedade&#8221; de artefatos a times ou indiv\u00edduos \u00e9 similar a iniciativa de atribuir mantenedores para projetos\u00a0<em>open source.<\/em> Ou seja, determinar responsabilidade pela qualidade atual e futura de um artefato para algu\u00e9m que ir\u00e1 o &#8220;zelar e protejer&#8221;.<\/p>\n<p>A &#8220;propriedade&#8221; de artefatos n\u00e3o \u00e9 uma maneira de coibir contribui\u00e7\u00f5es, muito pelo contr\u00e1rio, \u00e9 um incentivo para participa\u00e7\u00e3o ativa. Cabe aos &#8220;propriet\u00e1rios&#8221; arbitrar, apenas, que contribui\u00e7\u00f5es est\u00e3o prontas para serem aceitas.<\/p>\n<p>Artefatos sem um &#8220;dono&#8221; s\u00e3o \u00f3rf\u00e3os. Ali\u00e1s, \u00e9 um cen\u00e1rio comum nas organiza\u00e7\u00f5es que &#8220;donos&#8221; de artefatos deixem a empresa e, consequentemente, deixem seus &#8220;artefatos filhos&#8221; desprovidos de cuidado &#8211; da\u00ed, logo, &#8220;difus\u00e3o de responsabilidade&#8221;.<\/p>\n<h2>Iniciando a &#8220;jornada SOA&#8221;<\/h2>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> O &#8220;come\u00e7o natural&#8221; para ado\u00e7\u00e3o de SOA consiste na segrega\u00e7\u00e3o da &#8220;camada de neg\u00f3cios&#8221; em servi\u00e7os.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\nA evolu\u00e7\u00e3o dos modelos de opera\u00e7\u00e3o e distribui\u00e7\u00e3o de software, associados com o desenvolvimento de t\u00e9cnicas mais apropriadas de an\u00e1lise de dom\u00ednios de neg\u00f3cios, autorizaram a decomposi\u00e7\u00e3o das tradicionais &#8220;camadas de neg\u00f3cios&#8221; em contextos delimitados, distribu\u00eddos idealmente em servi\u00e7os, nos moldes prescritos por SOA.\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1769 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_dominio.png\" alt=\"\" width=\"737\" height=\"361\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_dominio.png 737w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_dominio-300x147.png 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<p>Na vis\u00e3o do modelo indicada acima, os servi\u00e7os s\u00e3o desenvolvidos e distribu\u00eddos de forma &#8220;quase independente&#8221;, exceto por serem todos acoplados a um \u00fanico banco de dados monol\u00edtico.<\/p>\n<hr \/>\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;\">Domain-driven Design<\/p>\r\n<\/p>\n<p>Eric Evans escreveu, em 2003, o livro &#8216;<em>Domain-driven Design<\/em>&#8216;. Trata-se de uma formaliza\u00e7\u00e3o de pr\u00e1ticas e padr\u00f5es para, segundo o autor, atacara complexidade no cora\u00e7\u00e3o do software.<\/p>\n<p>Um dos fundamentos de <em>Domain-driven Design<\/em> \u00e9 identificar, dentro de um determinado dom\u00ednio de neg\u00f3cio, subdom\u00ednios que, mais tarde, s\u00e3o modelados em contextos delimitados. Na modelagem de sistemas da forma como apresentamos aqui, cada contexto delimitado pode ser &#8220;implementado&#8221; como um servi\u00e7o <\/div>\n<strong>Os servi\u00e7os, individualmente, tendem a ter difus\u00e3o de responsabilidade mais baixa, enquanto o banco de dados e a interface com usu\u00e1rio, al\u00e9m de acoplamento aferente e eferente maiores, tendem a ter difus\u00e3o de responsabilidade mais alta.<\/strong> Nesses cen\u00e1rios, n\u00e3o \u00e9 incomum que a base de dados (e a interface com o usu\u00e1rio) passem a ter controle direto de times especialista, com &#8220;senso de propriedade&#8221; suficiente para manter, via burocracia, qualidade interna mais alta.\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> A segrega\u00e7\u00e3o do neg\u00f3cio em servi\u00e7os leva a forma\u00e7\u00e3o natural de camadas de servi\u00e7os como experi\u00eancia -&gt; processo -&gt; sistema.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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;\">O problema com '<em>Kernel<\/em> Compartilhado'<\/p>\r\n<\/p>\n<p><em>Domain-driven\u00a0<\/em><em>Design\u00a0<\/em>autoriza a identifica\u00e7\u00e3o e implementa\u00e7\u00e3o de\u00a0<i>kernels\u00a0<\/i>compartilhados: parte do modelo de dom\u00ednio de uso comum para dois ou mais contextos delimitados. Entretanto, antes de solu\u00e7\u00e3o, este tipo de artefato representa problema.<\/p>\n<p><em>Kernels\u00a0<\/em>compartilhados s\u00e3o naturalmente acoplados (de maneira aferente) e nascem com difus\u00e3o de responsabilidade alta. Eventualmente, representam redu\u00e7\u00e3o dos custos de desenvolvimento, mas, seguramente, representam acr\u00e9scimo no custo de manuten\u00e7\u00e3o.<\/p>\n<p><\/div>\n<h2>Considera\u00e7\u00f5es sobre as interfaces com usu\u00e1rios e sistemas externos<\/h2>\n<h4>Particionando a &#8220;interface com o usu\u00e1rio&#8221; conforme servi\u00e7os<\/h4>\n<p>Uma forma de reduzir os impactos do aumento crescente do acoplamento eferente na interface com o usu\u00e1rio \u00e9 particion\u00e1-la tamb\u00e9m, reduzindo indiretamente os riscos de difus\u00e3o de responsabilidade.<\/p>\n<strong>N\u00e3o \u00e9 raro que diferentes perfis de usu\u00e1rios demandem e valorizem caracter\u00edsticas diferentes de usabilidade.<\/strong> Por exemplo, enquanto vendedores tendem a valorizar simplicidade e objetividade, analistas financeiros geralmente gostam dor maior volume de informa\u00e7\u00f5es concentrado (com menos espa\u00e7os em branco). Por isso, antes de ser um problema, o particionamento da interface pode ser uma &#8220;solu\u00e7\u00e3o&#8221; para a inclus\u00e3o de adapta\u00e7\u00f5es, com coes\u00e3o de padr\u00f5es de projeto de UX.\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1771 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_interface.png\" alt=\"\" width=\"737\" height=\"360\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_interface.png 836w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_interface-300x146.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/camada_interface-768x375.png 768w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<p>O particionamento da interface com o usu\u00e1rio geralmente segue os mesmos crit\u00e9rios de dom\u00ednio aplicados nos servi\u00e7os na &#8220;camada de neg\u00f3cios&#8221;.<\/p>\n<h4>A &#8220;emerg\u00eancia&#8221; das APIs externas<\/h4>\nEventualmente, servi\u00e7os internos ir\u00e3o interagir diretamente com sistemas de terceiros que ir\u00e3o oferecer uma &#8220;interface alternativa&#8221; para alguns &#8220;servi\u00e7os de neg\u00f3cios&#8221; de um software. Nesses casos, pode ser uma boa ideia oferecer um servi\u00e7o espec\u00edfico para atender \u00e0s demandas desse servi\u00e7o externo, reduzindo acoplamento eferente externo (e as chances de quebra).\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1778 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/external_api.png\" alt=\"\" width=\"737\" height=\"444\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/external_api.png 836w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/external_api-300x181.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/external_api-768x463.png 768w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<p>Prover uma API externa tamb\u00e9m \u00e9 um bom caminho para reduzir a difus\u00e3o de responsabilidade de integra\u00e7\u00f5es cr\u00edticas e proteger o neg\u00f3cio.<\/p>\nAPIs externas &#8220;dedicadas&#8221; para cada sistema terceiro podem reduzir as &#8220;barreiras de ado\u00e7\u00e3o&#8221;, entretanto, obviamente, n\u00e3o se pode ignorar os custos, sobretudo de manuten\u00e7\u00e3o. Para parcerias menos impactantes para o neg\u00f3cio \u00e9 desej\u00e1vel deixar emergir uma API comum, entretanto, essa n\u00e3o deve ser a primeira linha de a\u00e7\u00e3o.\n<hr \/>\n<h2>A &#8220;emerg\u00eancia&#8221; de camadas de orquestra\u00e7\u00e3o (<em>gateways<\/em> e barramentos)<\/h2>\n<p>Caso exista necessidade crescente de fazer acesso externo aos servi\u00e7os de dom\u00ednio, al\u00e9m da API externa, \u00e9 uma boa pr\u00e1tica adicionar uma camada com um<em>\u00a0<\/em><em>proxy\u00a0<\/em>reverso ou\u00a0<em>gateway.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1784 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/gateway.png\" alt=\"\" width=\"694\" height=\"427\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/gateway.png 694w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/gateway-300x185.png 300w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><\/p>\n<p>O <em>gateway\u00a0<\/em>reduz o acoplamento aferente dos servi\u00e7os e tamb\u00e9m \u00e9 um bom mecanismo para consolidar demandas por m\u00e9tricas, seguran\u00e7a, bilhetagem, auditoria e descoberta.<\/p>\n<p>Outra atividade comum \u00e9 orquestrar a rela\u00e7\u00e3o entre os servi\u00e7os atrav\u00e9s de uma ESB.<\/p>\n<h2>O banco de dados em um &#8220;mundo SOA&#8221;<\/h2>\n<h4>Particionando logicamente o &#8220;banco de dados&#8221;<\/h4>\n<strong>A decomposi\u00e7\u00e3o da &#8220;camada de neg\u00f3cios&#8221; em servi\u00e7os e da &#8220;camada de interface&#8221; em experi\u00eancias independentes, implicam no aumento do acoplamento aferente do banco de dados, o que \u00e9 um problema em potencial, mesmo com o n\u00famero reduzido de servi\u00e7os (geralmente, 7 em arquiteturas assim)<\/strong>. Se n\u00e3o forem feitas de maneira apropriada, altera\u00e7\u00f5es de esquema podem causar problemas nos diversos servi\u00e7os, o que aumenta bastante a necessidade de coordena\u00e7\u00e3o.\n<hr \/>\n<p>Uma sa\u00edda r\u00e1pida, costuma ser prover um componente com modelo de persist\u00eancia para ser utilizado nos diversos servi\u00e7os, suficiente para causar falhas no\u00a0<em>build\u00a0<\/em>quando altera\u00e7\u00f5es de esquema forem realizadas. O versionamento do modelo de persist\u00eancia \u00e9 fiel a evolu\u00e7\u00e3o do esquema.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1773 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/persistence_model.png\" alt=\"\" width=\"737\" height=\"360\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/persistence_model.png 836w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/persistence_model-300x146.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/persistence_model-768x375.png 768w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<p>Em seguida, uma boa ideia \u00e9 recorrer a mecanismos para particionar logicamente o banco de dados criando modelos de persist\u00eancia decompostos pelos diferentes contextos delimitados. <strong>Modernamente, recursos como particionamento vertical, permitem a administra\u00e7\u00e3o de bases de maneira inteligente, melhorando a performance.<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1774 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/vertical_partition.png\" alt=\"\" width=\"737\" height=\"360\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/vertical_partition.png 836w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/vertical_partition-300x146.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/vertical_partition-768x375.png 768w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<p>O particionamento vertical, eventualmente, demandar\u00e1 um componentes com modelos de persist\u00eancia tamb\u00e9m particionados para serem utilizados nos diversos servi\u00e7os, suficientes para causar falhas no <em>build\u00a0<\/em>quando altera\u00e7\u00f5es de esquema forem realizadas. O versionamento do modelo de persist\u00eancia \u00e9 fiel a evolu\u00e7\u00e3o do esquema.<\/p>\n<h4>Particionando fisicamente o &#8220;banco de dados&#8221;<\/h4>\n<p>Eventualmente, h\u00e1 possibilidades para particionar um banco de dados monol\u00edtico em inst\u00e2ncias independentes, alinhadas ao dom\u00ednio, de forma semelhante ao que ocorre com microsservi\u00e7os.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1779 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/banco_separado.png\" alt=\"\" width=\"737\" height=\"360\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/banco_separado.png 694w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/banco_separado-300x147.png 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<strong>O ponto importante, aqui, \u00e9 garantir que cada banco de dados n\u00e3o seja necess\u00e1rio para outros servi\u00e7os e, tamb\u00e9m, duplica\u00e7\u00e3o de dados, exceto quando isso for natural<\/strong>. Excepcionalmente, o particionamento das bases de dados pode ser justificada por problemas de performance.\n<h2>Cuidado com a complexidade<\/h2>\n<p><b>A complexidade tem quatro origens gen\u00e9ricas distintas que devem ser combatidas. S\u00e3o elas: dimensionalidade, interdepend\u00eancia, influ\u00eancia do ambiente e irreversibilidade.<\/b><\/p>\n<strong>Quanto maior o n\u00famero de vari\u00e1veis envolvidas, maior ser\u00e1 a dimensionalidade.<\/strong> Por isso, por exemplo, qualquer software com mais <i>features <\/i>se torna mais complexo. A cada novo processo na organiza\u00e7\u00e3o, menor a simplicidade. Toda exce\u00e7\u00e3o suportada aumenta o custo. Times maiores tornam a coordena\u00e7\u00e3o e sincroniza\u00e7\u00e3o mais complexa. Por outro lado, o fracionamento em servi\u00e7os, com particionamento l\u00f3gico ou f\u00edsico de bancos de dados, aumenta a dimensionalidade da arquitetura. Por isso, benef\u00edcios precisam ser ponderados!\n<hr \/>\n<b>Opera\u00e7\u00f5es interdependentes demandam sincroniza\u00e7\u00e3o.<\/b> N\u00e3o raro, a indisponibilidade de um recurso impossibilita o uso de outro, aparentemente n\u00e3o relacionado. \u00c9 bastante comum que uma performance mais pobre de uma parte de um sistema deixe ele todo \u201clento\u201d. Este \u00e9 o mesmo limitante em times particionados por crit\u00e9rios t\u00e9cnicos, eventualmente, a performance ruim de um time acarreta em atrasos para todos os demais.\n<hr \/>\n<p>Sistemas mais \u201csens\u00edveis\u201d ao ambiente tamb\u00e9m s\u00e3o mais complexos. Afinal, demandam planejamento de conting\u00eancias e <i>workarounds<\/i>. Da mesma forma, times mais &#8220;sens\u00edveis&#8221; a influ\u00eancias externas tamb\u00e9m precisam se preparar para conting\u00eancias e\u00a0<em>workarounds.<\/em><\/p>\n<p>Finalmente, a irreversibilidade tamb\u00e9m demanda cuidados. A\u00e7\u00f5es ou eventos cujo ocorr\u00eancias resultem em consequ\u00eancias que n\u00e3o podem ser desfeitas implicam em custo maior de planejamento<del>, nem sempre eficiente. <\/del>Da\u00ed, a \u00eanfase para servidores imut\u00e1veis, principalmente para sistemas com \u00edndice maior de particionamento.<\/p>\n<strong>A gest\u00e3o da complexidade na arquitetura de um software implica, invariavelmente, na gest\u00e3o da complexidade dos times desenvolvedores de software.<\/strong> O particionamento em servi\u00e7os, por exemplo, aumenta a dimensionalidade dos componentes, mas reduz a dimensionalidade de\u00a0<em>features\u00a0<\/em>por componente. Da mesma forma, aumenta a dimensionalidade na quantidade de times, mas reduz a quantidade de membros por time. Ganhos e perdas!\n<h2><span id=\"TODO\">\/\/ TODO<\/span><\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo as seguintes reflex\u00f5es:<\/p>\n<ul>\n<li>Voc\u00ea conseguiria decompor seu sistema em contextos delimitados claros e independentes?<\/li>\n<li>Quais seriam as dificuldades e facilidades para particionamento da base de dados (l\u00f3gico ou f\u00edsico)?<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"featured_media":1791,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[59],"apendices":[],"capitulos":[31],"class_list":["post-3541","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-secao-3","capitulos-capitulo-3-3"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os - 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\/fundamentos-para-arquiteturas-baseadas-em-servicos\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"&#8212; Este cap\u00edtulo ainda carece de edi\u00e7\u00e3o e conex\u00e3o apropriada entre os t\u00f3picos. Aprecie com modera\u00e7\u00e3o. De forma ampla, abordagens\u00a0service-oriented implicam em &#8220;perceber&#8221; sistemas complexos como conjunto de servi\u00e7os, cada um deles atendendo um conjunto bem claro de atividades de neg\u00f3cio ou demandas t\u00e9cnicas, sempre orientadas a um determinado\u00a0outcome. Todo servi\u00e7o deve ser, dentro do [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/\" \/>\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-12T21:16:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\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=\"20 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\/fundamentos-para-arquiteturas-baseadas-em-servicos\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/\",\"name\":\"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg\",\"datePublished\":\"2022-06-30T17:59:17+00:00\",\"dateModified\":\"2024-01-12T21:16:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg\",\"width\":1024,\"height\":683},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#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\":\"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os\"}]},{\"@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":"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os - 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\/fundamentos-para-arquiteturas-baseadas-em-servicos\/","og_locale":"pt_BR","og_type":"article","og_title":"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os - Manual do Arquiteto de Software","og_description":"&#8212; Este cap\u00edtulo ainda carece de edi\u00e7\u00e3o e conex\u00e3o apropriada entre os t\u00f3picos. Aprecie com modera\u00e7\u00e3o. De forma ampla, abordagens\u00a0service-oriented implicam em &#8220;perceber&#8221; sistemas complexos como conjunto de servi\u00e7os, cada um deles atendendo um conjunto bem claro de atividades de neg\u00f3cio ou demandas t\u00e9cnicas, sempre orientadas a um determinado\u00a0outcome. Todo servi\u00e7o deve ser, dentro do [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-12T21:16:15+00:00","og_image":[{"width":1024,"height":683,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"20 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/","name":"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg","datePublished":"2022-06-30T17:59:17+00:00","dateModified":"2024-01-12T21:16:15+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg","width":1024,"height":683},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-servicos\/#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":"Cap 3.3 Fundamentos para arquiteturas baseadas em servi\u00e7os"}]},{"@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\/3541","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=3541"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/1791"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=3541"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=3541"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=3541"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=3541"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=3541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}