{"id":1829,"date":"2021-05-30T09:41:30","date_gmt":"2021-05-30T12:41:30","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=1829"},"modified":"2024-01-11T18:00:47","modified_gmt":"2024-01-11T21:00:47","slug":"fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/","title":{"rendered":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0"},"content":{"rendered":"Em um mundo cada vez mais conectado, onde produtos e sistemas t\u00eam cada vez mais sensores e poder de processamento, com modelos de neg\u00f3cios cada vez mais adaptados ao comportamento individual, ganha mais relev\u00e2ncia a capacidade de reconhecer, assimilar e reagir adequadamente a ocorr\u00eancia de eventos de diversas naturezas.\n<hr \/>\n<p style=\"padding-left: 40px;\"><em>A tecnologia da informa\u00e7\u00e3o est\u00e1 revolucionando os produtos. Antes compostos apenas por pe\u00e7as mec\u00e2nicas e el\u00e9tricas, os produtos se tornaram sistemas complexos que combinam hardware, sensores, armazenamento de dados, microprocessadores, software e conectividade de in\u00fameras maneiras. (Porter e Heppelmann)<\/em><\/p>\n<p><strong>Sob a perspectiva de sistemas computacionais um evento \u00e9 um registro de algo que j\u00e1 aconteceu.<\/strong> Uma venda realizada, uma entrega efetuada, um pagamento efetivado, etc.<\/p>\n<p><strong>O aumento exponencial na quantidade de sensores e na conectividade tem feito &#8220;explodir&#8221; a quantidade e \u00a0granularidade de eventos identificados em sistemas computacionais que precisam ser assimilados e tratados.<\/strong> Carros modernos, por exemplo, al\u00e9m de todos os sensores que monitoram o comportamento de seus componentes, tamb\u00e9m registram o comportamento dos condutores, identificam outros carros e as condi\u00e7\u00f5es da pista. Neles, o software embarcado toma decis\u00f5es &#8220;inteligentes&#8221; em tempo real e, eventualmente, conecta-se a outros software na &#8220;nuvem&#8221;, para realiza\u00e7\u00e3o de a\u00e7\u00f5es consolidadas.<\/p>\n<p>A demanda por formas eficientes de lidar com eventos tamb\u00e9m \u00e9 marcante em opera\u00e7\u00f5es com cart\u00f5es de cr\u00e9dito e sistemas de vota\u00e7\u00e3o, detectando fraudes; em sistemas de atendimento, qualificando o processo; em sistemas de vendas, habilitando\u00a0<em>up-selling\u00a0<\/em>e\u00a0<em>cross-selling,\u00a0<\/em>apenas para citar mais alguns exemplos.<\/p>\n<p><strong>Sistemas modernos precisam reconhecer, assimilar e tratar eventos de maneira eficiente e eficaz e essa realidade fez surgir uma s\u00e9rie de padr\u00f5es e pr\u00e1ticas arquiteturais.<\/strong> As arquiteturas que utilizam esses padr\u00f5es e pr\u00e1ticas s\u00e3o identificadas como <em>event-driven architectures<\/em>\u00a0(EDAs). Elas se destacam por serem\u00a0escal\u00e1veis, adapt\u00e1veis, responsivas e, geralmente, perform\u00e1ticas.<\/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;\">Diferen\u00e7a entre responsividade e performance<\/p>\r\n<\/p>\n<p>Frequentemente, h\u00e1 confus\u00e3o entre responsividade e performance.<\/p>\n<p>A <strong>responsividade<\/strong>\u00a0\u00e9 um atributo de qualidade que tem rela\u00e7\u00e3o com o tempo que um usu\u00e1rio ou sistema cliente tem de esperar para, ap\u00f3s iniciar alguma opera\u00e7\u00e3o, poder iniciar outra.<\/p>\n<p>A <strong>performance<\/strong>, tamb\u00e9m um atributo de qualidade, tem rela\u00e7\u00e3o com o tempo total demandado por um sistema computacional para processar uma opera\u00e7\u00e3o completamente.<\/p>\n<p>Assim, um sistema pode ser responsivo sem ser perform\u00e1tico.<\/p>\n<p><\/div>\n<p><strong>Aplica\u00e7\u00f5es desenvolvidas com arquiteturas <em>event-driven<\/em> s\u00e3o compostas por componentes desacoplados para produ\u00e7\u00e3o e tratamento de eventos, sempre de maneira ass\u00edncrona.<\/strong><\/p>\nO desacoplamento dos componentes de arquiteturas <em>event-driven\u00a0<\/em>facilita a defini\u00e7\u00e3o de\u00a0<em>ownership,\u00a0<\/em>reduzindo riscos de difus\u00e3o de responsabilidade, e se destacam pelo\u00a0<em>evolvability<\/em>. Entretanto, \u00e9 ineg\u00e1vel a complexidade frente a pr\u00e1ticas e padr\u00f5es ortodoxos.\n<h2><em>Request-driven<\/em> versus <em>Event-driven<\/em><\/h2>\n<p><strong>Os benef\u00edcios gerados por arquiteturas\u00a0<em>event-driven\u00a0<\/em>chamam a aten\u00e7\u00e3o mesmo em cen\u00e1rios onde lidar com eventos n\u00e3o \u00e9 necessidade prim\u00e1ria.<\/strong><\/p>\n<p><strong>A maioria das aplica\u00e7\u00f5es LoB (<i>Line-of-business<\/i>), por exemplo, operam, tradicionalmente, em modelo\u00a0<i>request-driven.\u00a0<\/i><\/strong>Ou seja, onde requisi\u00e7\u00f5es s\u00e3o realizadas atrav\u00e9s de interfaces com usu\u00e1rios, suportadas por APIs, encaminhadas para\u00a0<em>handlers\u00a0<\/em>que, por sua vez, fazem consultas ou atualiza\u00e7\u00f5es em bases de dados, normalmente de forma s\u00edncrona. Esse modelo \u00e9 plenamente alinhado com a realidade do dom\u00ednio e geralmente apropriado. Entretanto, apresenta desafios bem conhecidos para suportar o aumento da escala sem comprometer a efici\u00eancia.<\/p>\n<p><strong>Os benef\u00edcios de arquiteturas\u00a0<em>event-driven\u00a0<\/em>t\u00eam levado times de tecnologia e de neg\u00f3cios a adaptar seus modelos de opera\u00e7\u00e3o para que sejam compat\u00edveis com elas, visando melhorar a responsividade e resili\u00eancia de\u00a0seus sistemas.<\/strong> O varejo online, por exemplo, vem &#8220;desacoplando&#8221; processos de venda, segregando eventos em &#8220;pedido realizado&#8221;, &#8220;pagamento efetivado&#8221;, &#8220;produto separado&#8221;, etc.<\/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;\">EDA e Domain-driven design<\/p>\r\n<\/p>\n<p>A elabora\u00e7\u00e3o de arquiteturas\u00a0<em>event-driven\u00a0<\/em>tem sido facilitada pelo uso de\u00a0<em>Domain-driven Design<\/em>.<\/p>\n<p>A identifica\u00e7\u00e3o de contextos delimitados, com suas respectivas responsabilidades, faz emergir naturalmente os &#8220;eventos de dom\u00ednio&#8221;, utilizados sobretudo para a comunica\u00e7\u00e3o entre contextos diversos, de maneira alinhada as demandas do neg\u00f3cio.<\/p>\n<p>Ali\u00e1s, uma das t\u00e9cnicas mais populares para &#8220;descoberta&#8221; do dom\u00ednio \u00e9 centrada em eventos: <em>event storming.<\/em><\/p>\n<p><\/div>\n\u00c9 recomend\u00e1vel adotar arquiteturas event-driven, em substitui\u00e7\u00e3o a <em>request-driven<\/em>,\u00a0em cen\u00e1rios que demandem responsividade (varejo online, por exemplo), com alta complexidade e dinamismo nas intera\u00e7\u00f5es. Entretanto, o aumento da complexidade n\u00e3o ter\u00e1 suficiente compensa\u00e7\u00e3o para opera\u00e7\u00f5es \u00a0mais simples e obrigatoriamente s\u00edncronas.\n<hr \/>\n<h2>Dois tipos de EDA<\/h2>\n<p><strong>De forma abstrata, podemos classificar arquiteturas\u00a0<i>event-driven\u00a0<\/i>em expl\u00edcitas e impl\u00edcitas.<\/strong><\/p>\n<p>Arquiteturas <em>event-driven<\/em>\u00a0s\u00e3o expl\u00edcitas quando os componentes que produzem eventos &#8220;conhecem&#8221; todos os componentes que os consomem. Nesses cen\u00e1rios, n\u00e3o \u00e9 incomum que os componentes produtores acionem os consumidores<em>\u00a0<\/em>diretamente, com c\u00f3digo. Evidentemente, tal abordagem aumenta o acoplamento.<\/p>\n<p>Em implementa\u00e7\u00f5es EDA impl\u00edcitas, n\u00e3o h\u00e1 qualquer &#8220;conex\u00e3o fixa&#8221; entre produtores e consumidores de eventos. Assim, componentes consumidores precisam especificar, de alguma forma, os tipos de eventos em que est\u00e3o interessados. Os produtores &#8220;publicam&#8221; os eventos aos consumidores atrav\u00e9s de algum mecanismo de &#8220;assinatura&#8221;, exercendo menor controle.<\/p>\nDos dois tipos de EDA, a abordagem impl\u00edcita \u00e9, evidentemente, mais poderosa, entretanto, incrementalmente mais complexa, pois, na medida em que os sistemas crescem, \u00e9 mais desafiador monitorar e avaliar resultados.\n<h2>Duas topologias fundamentais<\/h2>\n<p><strong>H\u00e1 duas topologias fundamentais para implementa\u00e7\u00e3o de arquiteturas <em>event-driven<\/em>. A primeira delas \u00e9 baseada na ideia de mediadores ativos e orquestra\u00e7\u00e3o. A segunda, \u00e9 baseada na utiliza\u00e7\u00e3o de intermediadores (<em>brokers<\/em>) e coreografia.<\/strong><\/p>\nImplementa\u00e7\u00f5es <em>event-driven<\/em> que utilizam mediadores ativos e orquestra\u00e7\u00e3o s\u00e3o mais apropriadas para cen\u00e1rios onde o tratamento de eventos precise ser gerenciado, com forte controle sobre falhas e sobre o andamento. Por outro lado, implementa\u00e7\u00f5es com <em>brokers<\/em> e coreografia s\u00e3o mais apropriadas para estruturas din\u00e2micas, <em>fire-and-forget<\/em>.\n<hr \/>\n<p>Ambas as abordagens assumem que um &#8220;evento inicial&#8221; ser\u00e1 capturado pelo sistema iniciando processamento.<\/p>\n<h4>Usando mediadores ativos e orquestra\u00e7\u00e3o<\/h4>\n<p><strong>A principal caracter\u00edstica de uma arquitetura event-driven com mediadores ativos e orquestra\u00e7\u00e3o \u00e9 a presen\u00e7a de um componente orquestrador (o mediador ativo) que gerencia e controla o fluxo de atividades, acionando componentes processadores, de maneira organizada, em tempos apropriados.<\/strong><\/p>\n<p>Nessa topologia, expl\u00edcita, um &#8220;evento inicial&#8221; \u00e9 submetido a uma fila que \u00e9 &#8220;escutada&#8221; pelo componente mediador. Este componente, por sua vez, &#8220;sabe&#8221; quais procedimentos que devem ser executados para &#8220;tratar&#8221; o evento e em que sequ\u00eancia. Por isso, aciona &#8220;executores&#8221;, notificando-os com eventos atrav\u00e9s de canais de eventos <em>point-to-point<\/em>.\u00a0Toda vez que um componente executor conclui seu trabalho, geralmente notifica o componente mediador.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-1833 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/EDA-0.png\" alt=\"\" width=\"677\" height=\"323\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/EDA-0.png 1806w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/EDA-0-300x143.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/EDA-0-1024x489.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/EDA-0-768x367.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/EDA-0-1536x733.png 1536w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/p>\n<p>Os componentes executores comunicam-se apenas com o componente mediador, nunca com outros componentes executores. Enquanto isso,\u00a0os componentes mediadores s\u00e3o a &#8220;fonte da verdade&#8221; com rela\u00e7\u00e3o ao est\u00e1gio de execu\u00e7\u00e3o de um fluxo para tratamento de um evento.<\/p>\n<p><img decoding=\"async\" class=\" wp-image-1835 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_1.png\" alt=\"\" width=\"742\" height=\"446\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_1.png 1806w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_1-300x180.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_1-1024x615.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_1-768x461.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_1-1536x922.png 1536w\" sizes=\"(max-width: 742px) 100vw, 742px\" \/><\/p>\n<p>Geralmente, aplica\u00e7\u00f5es com arquiteturas <em>event-driven<\/em> desenvolvidas nessa abordagem t\u00eam diversos componentes mediadores, algumas vezes, agrupados processos correlatos, outras vezes, ponderando estrat\u00e9gias para atender atributos de qualidade como disponibilidade, elasticidade e performance.<\/p>\n<p>Mediadores podem ser implementados em c\u00f3digo puro ou utilizando tecnologias como <a href=\"https:\/\/camel.apache.org\">Apache Camel<\/a> e <a href=\"https:\/\/www.mulesoft.com\/platform\/soa\/mule-esb-open-source-esb\">Mule ESB<\/a> ou <a href=\"https:\/\/ode.apache.org\">Apache ODE<\/a>. H\u00e1 tamb\u00e9m quem defenda a utiliza\u00e7\u00e3o de ferramentas BPM (e BPA).<\/p>\n<h4>Usando brokers e coreografia<\/h4>\n<p><strong>Diferente da abordagem utilizando mediadores e orquestra\u00e7\u00e3o, a utiliza\u00e7\u00e3o de <em>brokers<\/em> e coreografia se destaca pela inexist\u00eancia de um componente central, respons\u00e1vel pelo sequenciamento dos trabalhos.<\/strong><\/p>\n<p>Nessa topologia, impl\u00edcita, componentes executores s\u00e3o acionados de maneira encadeada, onde um componente executor encaminha um evento para um message broker (como <a href=\"https:\/\/www.rabbitmq.com\">RabbitMQ<\/a> ou outras implementa\u00e7\u00f5es <a href=\"https:\/\/www.amqp.org\">AMQP<\/a>), sempre que conclui seu trabalho, acionando outro(s) componente(s) executor(es), e assim sucessivamente, at\u00e9 que todo o processamento necess\u00e1rio aconte\u00e7a.<\/p>\n<p><img decoding=\"async\" class=\"wp-image-1844 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/eda_2.png\" alt=\"\" width=\"661\" height=\"662\" \/><\/p>\nA estrat\u00e9gia de cada componente executor ao encaminhar eventos \u00e9 do tipo <em>fire-and-forget<\/em> e \u00e9 muito importante que todo processamento executado seja notificado, com eventos, ao sistema, ampliando chances de extensibilidade ao custo de desperd\u00edcio de recursos computacionais (com eventos que n\u00e3o s\u00e3o &#8220;escutados&#8221; por ningu\u00e9m).\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;\">Fire-and-forget<\/p>\r\n<\/p>\n<p><strong><em>Fire-and-forget\u00a0<\/em>\u00e9 um padr\u00e3o de mensageria onde o produtor envia uma mensagem para um consumidor sem esperar resposta.\u00a0Trata-se da\u00a0forma\u00a0mais simples de troca de mensagens. <\/strong><\/p>\n<p><em>Fire-and-Forget<\/em>\u00a0destaca-se pelo baix\u00edssimo acoplamento, afinal o produtor n\u00e3o precisa saber nada sobre seus consumidores, incluindo quantos existem ou o que eles fazem com a mensagem.\u00a0Esse tipo de intera\u00e7\u00e3o sem estado resulta em sistemas de mensagens altamente escal\u00e1veis.<\/p>\n<p>A simplicidade e o baixo acoplamento, entretanto, tem seu pre\u00e7o: o tratamento de erros n\u00e3o \u00e9 poss\u00edvel porque n\u00e3o h\u00e1 <em>feedback<\/em> sobre a &#8220;entrega&#8221; das mensagens. Assim, implementa\u00e7\u00f5es <em>Fire-and-Forget<\/em> devem utilizar mecanismos mais robustos de &#8220;entrega&#8221; ou aceitarem que algumas mensagens possam ser perdidas. Al\u00e9m disso, \u00e9 importante ter consci\u00eancia de que um consumidor ter\u00e1 pouco a fazer caso a mensagem recebida esteja mal-formada ou com dados inv\u00e1lidos.<\/div>\n<h2>Tr\u00eas padr\u00f5es de processamento<\/h2>\n<p>Componentes executores assumem, basicamente, tr\u00eas padr\u00f5es de comportamento:<\/p>\n<ol>\n<li>processamento simples;<\/li>\n<li>processamento de <em>streams;\u00a0<\/em><\/li>\n<li>processamento de eventos complexos (<em>complex event processing<\/em> &#8211; CEP).<\/li>\n<\/ol>\n<hr \/>\n<p>Enquanto o padr\u00e3o de processamento simples ocorre tanto arquiteturas orquestradas e coreografadas, processamento de <em>streams <\/em>e de eventos complexos costumam ser implementadas apenas em topologias coreografadas.<\/p>\n<p>O detalhamento desses padr\u00f5es de execu\u00e7\u00e3o est\u00e3o al\u00e9m do escopo desse livro. Ali\u00e1s, h\u00e1 obras inteiras dedicadas ao tema.<\/p>\n<h4>Processamento simples<\/h4>\n<p>Componentes executores que operam adotando processamento simples, &#8220;escutam&#8221; um determinado tipo de mensagem e executam, para cada ocorr\u00eancia, algum trabalho. Trata-se do padr\u00e3o mais f\u00e1cil de implementar e, provavelmente, mais comum.<\/p>\n<h4>Processamento de <em>streams<\/em><\/h4>\n<p>Componentes executores que operam adotando processamento de <em>streams<\/em>, podem &#8220;escutar&#8221; diversas ocorr\u00eancias de eventos mas s\u00f3 executam algum processamento quando algum crit\u00e9rio \u00e9 atendido. Estes executores operam agregando, analisando e processando\u00a0<em>streams\u00a0<\/em>de eventos.<\/p>\n<p>Considere, por exemplo, um componente executor recebendo todas as transa\u00e7\u00f5es de um determinado cart\u00e3o de cr\u00e9dito. Caso duas transa\u00e7\u00f5es presenciais (dois eventos) sejam executadas em localidades afastadas a uma dist\u00e2ncia maior do que aquela que poderia ser percorrida no intervalo de tempo entre as ocorr\u00eancias, este\u00a0<em>executor\u00a0<\/em>poderia gerar um evento (agrega\u00e7\u00e3o) indicando possibilidade de fraude.<\/p>\n<h4>Processamento de eventos complexos (CEP)<\/h4>\n<p>Componentes executores que operam adotando processamento de eventos complexos, identificam eventos significativos (como oportunidades ou amea\u00e7as) a partir de eventos menos expressivos, oriundos de dois ou mais <em>streams<\/em>.<\/p>\n<h2>Event sourcing<\/h2>\n<p>Fazer com que um sistema lance eventos de notifica\u00e7\u00e3o para toda modifica\u00e7\u00e3o no estado de uma entidade abre espa\u00e7o para algumas solu\u00e7\u00f5es interessantes.\u00a0Podemos, por exemplo, usar os eventos de notifica\u00e7\u00e3o para, al\u00e9m de permitir implementa\u00e7\u00e3o desacoplada de consist\u00eancia eventual entre aplica\u00e7\u00f5es,\u00a0 contar a \u201chist\u00f3ria\u201d de entidades, atrav\u00e9s de uma t\u00e9cnica conhecida como <em>Event Sourcing<\/em>.<\/p>\n<p>A ideia central da t\u00e9cnica \u00e9 reconhecer que o estado de uma entidade \u00e9 \u201cexplicado\u201d pela ocorr\u00eancia de uma sequ\u00eancia clara de eventos, em uma ordem determinada.<\/p>\n<p>Com posse do hist\u00f3rico de eventos de notifica\u00e7\u00e3o de altera\u00e7\u00e3o de estado, podemos restituir qualquer um dos \u201cestados hist\u00f3ricos\u201d de uma entidade, bastando, para isso, que realizar um <em>replay <\/em>do seu hist\u00f3rico de eventos at\u00e9 o ponto apropriado.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1912\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_source.png\" alt=\"\" width=\"306\" height=\"424\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_source.png 492w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_source-216x300.png 216w\" sizes=\"(max-width: 306px) 100vw, 306px\" \/><\/p>\n<p>Em termos simples, matendo o hist\u00f3rico de eventos armazenado, podemos \u201crecuperar\u201d o estado de uma entidade, em qualquer momento. Podemos tamb\u00e9m saber quando mudan\u00e7as ocorreram, quem fez essas mudan\u00e7as e qual foi a inten\u00e7\u00e3o de neg\u00f3cio. Poderoso, por\u00e9m complexo!<\/p>\n<p>Sistemas que usam\u00a0<em>event sourcing\u00a0<\/em>costumam manter, al\u00e9m da base de eventos, uma outra base com materializa\u00e7\u00f5es do estado da entidade em algum momento (geralmente o atual).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1913 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_materialized.png\" alt=\"\" width=\"694\" height=\"424\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_materialized.png 1119w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_materialized-300x183.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_materialized-1024x626.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/event_materialized-768x469.png 768w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><\/p>\n<p>Essa materializa\u00e7\u00e3o \u00e9 \u00fatil por ser extermamente f\u00e1cil de pesquisar. Podemos pensar essas materializa\u00e7\u00f5es como \u201cfotografias\u201d do estado da entidade em algum momento. Talvez por isso, convencionou-se utililizar a designa\u00e7\u00e3o <em>snapshot.\u00a0<\/em><\/p>\n<p>A base de dados utilizada para armazenar eventos geralmente \u00e9\u00a0<em>nosql\u00a0<\/em>(o NuBank, por exemplo, utiliza Datomic para registrar transa\u00e7\u00f5es). A base para os <em>snapshots\u00a0<\/em>pode ser quaquer uma, inclusive relacionais. Ali\u00e1s, Greg Young, que formalizou o conceito de\u00a0<em>Event Sourcing<\/em>, criou um banco de dados para armazenar eventos chamado\u00a0<a href=\"https:\/\/eventstore.org\/\">EventStore<\/a>.<\/p>\nH\u00e1 diversas implementa\u00e7\u00f5es de <em>event sourcing <\/em>em sistemas de mercado. Ou seja, existem diversos sistemas que mant\u00e9m um hist\u00f3rico de eventos para justificar o estado de suas entidade.\u00a0De qualquer forma,\u00a0<em>event sourcing\u00a0<\/em>est\u00e1 longe de ser t\u00f3pico ou pr\u00e1tica comum. H\u00e1 uma diversidade gigantesca de complica\u00e7\u00f5es para uma implementa\u00e7\u00e3o correta e precisa existir uma justificativa muito forte para ado\u00e7\u00e3o.\n<hr \/>\n<h2>Reatividade natural<\/h2>\n<p>Arquiteturas\u00a0<em>event-driven, <\/em>quando bem implementadas,\u00a0s\u00e3o naturalmente reativas. Ou seja, s\u00e3o responsivas, resilientes, el\u00e1sticas e orientadas a mensagens.<\/p>\n<p>A <strong>responsividade<\/strong> \u00e9 natural ao processamento ass\u00edncrono, comum em EDAs.<\/p>\n<p>A <strong>resili\u00eancia<\/strong>, por sua vez, \u00e9 garantida pela estabilidade dos mecanismos de mensageria,<em>\u00a0<\/em>que \u201cseguram\u201d os eventos caso exista alguma instabilidade nos componentes processadores.<\/p>\n<p>A <strong>elasticidade\u00a0<\/strong>\u00e9 poss\u00edvel gra\u00e7as ao desacoplamento dos componentes executores dos demais<em>.\u00a0<\/em>Em princ\u00edpio, quando a demanda sobe pela ocorr\u00eancia de mais eventos,\u00a0componentes executores<em>\u00a0<\/em>mais pesados podem ter novas inst\u00e2ncias criadas e descartadas conforme a escala oscila.<\/p>\n<p>Por fim, o \u201cfluxo dos eventos\u201d \u00e9 naturalmente\u00a0<strong>orientado a mensagens<\/strong>.<\/p>\n<h2>Conway, outra vez!<\/h2>\n<p>Arquiteturas <em>event-driven\u00a0<\/em>geralmente s\u00e3o particionadas pelo dom\u00ednio, o que facilita a forma\u00e7\u00e3o de\u00a0times especialistas para caracter\u00edsticas do neg\u00f3cio.<\/p>\nGeralmente, a estrutura dos times ir\u00e1 replicar a topologia dos componentes executores e mediadores. Pelo alto acoplamento aferente, a infraestrutra dever\u00e1 ter\u00a0<em>ownership\u00a0<\/em>de um time dedicado, mesmo com pr\u00e1ticas maduras de DevOps, afim de evitar difus\u00e3o de responsabilidades. O mesmo \u00e9 v\u00e1lido para componentes mediadores em fun\u00e7\u00e3o do alto acoplamento eferente.\n<h2>Indica\u00e7\u00f5es e contraindica\u00e7\u00f5es<\/h2>\nArquiteturas\u00a0<em>event-driven\u00a0<\/em>s\u00e3o poderosas e est\u00e3o alinhadas com boas pr\u00e1ticas para implementa\u00e7\u00e3o de sistemas modulares, at\u00e9 mesmo com microsservi\u00e7os. Entretanto, s\u00e3o naturalmente complexas e quando esta complexidade n\u00e3o for bem justificada, a ado\u00e7\u00e3o deste estilo poder\u00e1 representar incremento de custo dif\u00edcil de justificar.\n<hr \/>\nA capacidade de lidar melhor com cen\u00e1rios din\u00e2micos e complexos vem com o custo indireto de lidar com consist\u00eancia eventual. As facilidades para escalar vem com o custo indireto de maior dificuldade para monitorar. As facilidades para adaptar e responder a demandas do neg\u00f3cio vem acompanhadas de maior dificuldade para testes de integra\u00e7\u00e3o.\n<hr \/>\n<h2>\/\/ TODO<\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, fa\u00e7a as seguintes reflex\u00f5es:<\/p>\n<ol>\n<li>O sistema em que est\u00e1 trabalhando agora lida, naturalmente, com eventos?<\/li>\n<li>Baseado em sua experi\u00eancia, com que frequ\u00eancia o aumento da complexidade justificaria &#8220;transformar&#8221; sistemas\u00a0<em>request-driven\u00a0<\/em>em\u00a0<em>event-driven<\/em>?<\/li>\n<li>Sistemas escal\u00e1veis s\u00e3o, geralmente, ass\u00edncronos. Concorda com essa afirma\u00e7\u00e3o?<\/li>\n<li>Em que cen\u00e1rios adotaria <em>Event Sourcing<\/em>?<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n","protected":false},"featured_media":1923,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[],"sessoes":[59],"apendices":[],"capitulos":[32],"class_list":["post-1829","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","sessoes-secao-3","capitulos-capitulo-3-4"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0 - 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-eventos-eda-capitulo-8-v-1-0\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"A tecnologia da informa\u00e7\u00e3o est\u00e1 revolucionando os produtos. Antes compostos apenas por pe\u00e7as mec\u00e2nicas e el\u00e9tricas, os produtos se tornaram sistemas complexos que combinam hardware, sensores, armazenamento de dados, microprocessadores, software e conectividade de in\u00fameras maneiras. (Porter e Heppelmann) Sob a perspectiva de sistemas computacionais um evento \u00e9 um registro de algo que j\u00e1 aconteceu. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/\" \/>\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-11T21:00:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"859\" \/>\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=\"13 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-eventos-eda-capitulo-8-v-1-0\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/\",\"name\":\"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0 - 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-eventos-eda-capitulo-8-v-1-0\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg\",\"datePublished\":\"2021-05-30T12:41:30+00:00\",\"dateModified\":\"2024-01-11T21:00:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg\",\"width\":1024,\"height\":859},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#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\":\"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0\"}]},{\"@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":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0 - 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-eventos-eda-capitulo-8-v-1-0\/","og_locale":"pt_BR","og_type":"article","og_title":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0 - Manual do Arquiteto de Software","og_description":"A tecnologia da informa\u00e7\u00e3o est\u00e1 revolucionando os produtos. Antes compostos apenas por pe\u00e7as mec\u00e2nicas e el\u00e9tricas, os produtos se tornaram sistemas complexos que combinam hardware, sensores, armazenamento de dados, microprocessadores, software e conectividade de in\u00fameras maneiras. (Porter e Heppelmann) Sob a perspectiva de sistemas computacionais um evento \u00e9 um registro de algo que j\u00e1 aconteceu. [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T21:00:47+00:00","og_image":[{"width":1024,"height":859,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/","name":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0 - 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-eventos-eda-capitulo-8-v-1-0\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg","datePublished":"2021-05-30T12:41:30+00:00","dateModified":"2024-01-11T21:00:47+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg","width":1024,"height":859},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-0\/#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":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.0"}]},{"@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\/1829","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=1829"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/1923"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=1829"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=1829"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=1829"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=1829"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=1829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}