{"id":5073,"date":"2022-07-07T15:09:06","date_gmt":"2022-07-07T18:09:06","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=5073"},"modified":"2024-01-11T18:01:04","modified_gmt":"2024-01-11T21:01:04","slug":"fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/","title":{"rendered":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.02"},"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<p>Outro ponto interessante relacionado \u00e0 arquiteturas <em>event-driven<\/em>, frente a arquiteturas <em>request-driven,<\/em>\u00a0\u00e9 a amplia\u00e7\u00e3o da resili\u00eancia em fun\u00e7\u00e3o da possibilidade de tratar mensagens mal-formadas ou <em>poison pills,\u00a0<\/em>sem comprometer o fluxo transacional. Afinal, mensagens &#8220;problem\u00e1ticas&#8221; voltam para a fila, para retentativas, e, eventualmente, podem ser encaminhadas para filas de mensagens com problemas.<\/p>\n\u00c9 recomend\u00e1vel adotar arquiteturas event-driven, em substitui\u00e7\u00e3o a <em>request-driven<\/em>, em cen\u00e1rios que demandem responsividade (varejo online, por exemplo) e resili\u00eancia, 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>De maneira concreta, quando o mediador exerce fun\u00e7\u00e3o ativa, direcionado o <em>workflow<\/em>, muitas vezes comunica-se enviando comandos para os diversos processadores.<\/p>\n<p><img decoding=\"async\" class=\"wp-image-1928 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/commands.png\" alt=\"\" width=\"776\" height=\"470\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/commands.png 1788w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/commands-300x182.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/commands-1024x620.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/commands-768x465.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/commands-1536x930.png 1536w\" sizes=\"(max-width: 776px) 100vw, 776px\" \/><\/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>Sagas<\/h2>\n<p>Em aplica\u00e7\u00f5es monol\u00edticas, geralmente, temos um <em>frontend<\/em> conectando a um \u00fanico servi\u00e7o que, por sua vez, se conecta a apenas um banco de dados que serve como a \u201cgrande fonte da verdade\u201d.\u00a0Por mais complexas que sejam as opera\u00e7\u00f5es, podemos usar, quase sempre o recurso de transa\u00e7\u00f5es do banco de dados para garantir a preserva\u00e7\u00e3o da consist\u00eancia.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7770 lazyloaded\" src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente.png\" sizes=\"(max-width: 773px) 100vw, 773px\" srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente.png 773w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente-300x142.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente-768x363.png 768w\" alt=\"\" width=\"565\" height=\"267\" data-srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente.png 773w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente-300x142.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente-768x363.png 768w\" data-src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/tradicionalmente.png\" data-sizes=\"(max-width: 773px) 100vw, 773px\" \/><\/p>\n<p>Imaginemos, entretanto, que n\u00e3o seja poss\u00edvel estabelecer uma \u201cfonte \u00fanica de verdade\u201d ou, ainda, que a arquitetura da aplica\u00e7\u00e3o utilize mais que um banco de dados (conforme contexto delimitado).\u00a0 Vamos considerar, por exemplo, o desenvolvimento de um servi\u00e7o para apoiar a compra de produtos associados a viagens. Nesse contexto, desejar\u00edamos ajudar nossos clientes na aquisi\u00e7\u00e3o de bilhetes a\u00e9reos, no aluguel de carros e na reservas em hot\u00e9is.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7771 lazyloaded\" src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices.png\" sizes=\"(max-width: 973px) 100vw, 973px\" srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices.png 973w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices-300x119.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices-768x305.png 768w\" alt=\"\" width=\"744\" height=\"295\" data-srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices.png 973w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices-300x119.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices-768x305.png 768w\" data-src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/microservices.png\" data-sizes=\"(max-width: 973px) 100vw, 973px\" \/><\/p>\n<p>No &#8220;mundo perfeito&#8221;, sempre que um cliente resolvesse viajar, poder\u00edamos disparar a compra do bilhete a\u00e9reo, a reserva do hotel e do carro de forma paralela. Nosso trabalho seria apenas consolidar as confirma\u00e7\u00f5es em nosso \u201cbanco de dados\u201d para poder fornecer ao cliente as informa\u00e7\u00f5es de cada servi\u00e7o contratado. Mas, o que aconteceria se:<\/p>\n<ul>\n<li>N\u00e3o houvesse hotel dispon\u00edvel para a cidade escolhida pelo nosso cliente?<\/li>\n<li>N\u00e3o houvesse a op\u00e7\u00e3o de carro que o cliente precisa?<\/li>\n<li>N\u00e3o houvesse op\u00e7\u00e3o vi\u00e1vel de voo?<\/li>\n<\/ul>\n<hr \/>\n<p>Na pr\u00e1tica, provavelmente, a falha de qualquer uma dessas opera\u00e7\u00f5es implicaria no cancelamento da viagem. Entretanto, perceba que, agora, n\u00e3o temos uma \u201ctransa\u00e7\u00e3o\u201d para dar <em>rollback<\/em>. A sa\u00edda emp\u00edrica \u00e9 executar uma atividade compensat\u00f3ria (cancelamentos) anulando os efeitos produzidos nos servi\u00e7os que foram completados com \u00eaxito.<\/p>\n<p>No nosso exemplo, se tivessemos \u00eaxito em reservar o hotel e o carro, mas houvesse uma falha na compra do bilhete a\u00e9rero, ter\u00edamos que \u201cvoltar\u201d aos servi\u00e7os fornecidos pelo hotel e pela locadora de autom\u00f3veis para cancelar reservas. Para tornar o cen\u00e1rio ainda mais desafiador, precisar\u00edamos entender as implica\u00e7\u00f5es destes cancelamentos para evitar multas, por exemplo. A solu\u00e7\u00e3o \u00e9 implementar o padr\u00e3o Sagas.<\/p>\n<p><strong>Saga \u00e9 uma transa\u00e7\u00e3o de longa dura\u00e7\u00e3o que pode ser escrita como uma sequ\u00eancia de transa\u00e7\u00f5es independentes e intercambi\u00e1veis.\u00a0Todas as transa\u00e7\u00f5es na sequ\u00eancia devem ser completadas com \u00eaxito. Caso contr\u00e1rio, a\u00e7\u00f5es compensat\u00f3rias s\u00e3o executadas para desfazer os efeitos da execu\u00e7\u00e3o parcial.<\/strong><\/p>\n<p>Em nosso exemplo, a saga \u201cViagem do Elemar\u201d seria composta por tr\u00eas transa\u00e7\u00f5es independentes: 1) Compra da Passagem A\u00e9rea; 2) Reserva do Hotel e 3) Reserva do Carro.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7772 lazyloaded\" src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga.png\" sizes=\"(max-width: 819px) 100vw, 819px\" srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga.png 819w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga-300x77.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga-768x196.png 768w\" alt=\"\" width=\"678\" height=\"173\" data-srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga.png 819w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga-300x77.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga-768x196.png 768w\" data-src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/saga.png\" data-sizes=\"(max-width: 819px) 100vw, 819px\" \/><\/p>\n<p>Cada transa\u00e7\u00e3o na Saga, tem uma a\u00e7\u00e3o compensat\u00f3ria capaz de \u201cdesfazer\u201d uma transa\u00e7\u00e3o parcial bem-sucedida.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7773 lazyloaded\" src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria.png\" sizes=\"(max-width: 819px) 100vw, 819px\" srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria.png 819w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria-300x114.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria-768x291.png 768w\" alt=\"\" width=\"676\" height=\"256\" data-srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria.png 819w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria-300x114.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria-768x291.png 768w\" data-src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/compensatoria.png\" data-sizes=\"(max-width: 819px) 100vw, 819px\" \/><\/p>\n<p>A implementa\u00e7\u00e3o mais simples para a saga seria atrav\u00e9s de um componente orquestrado:\u00a0<em>saga events coordinator<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7774 lazyloaded\" src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC.png\" sizes=\"(max-width: 973px) 100vw, 973px\" srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC.png 973w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC-300x119.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC-768x305.png 768w\" alt=\"\" width=\"716\" height=\"284\" data-srcset=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC.png 973w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC-300x119.png 300w, https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC-768x305.png 768w\" data-src=\"https:\/\/elemarjr.com\/wp-content\/uploads\/2018\/03\/SEC.png\" data-sizes=\"(max-width: 973px) 100vw, 973px\" \/><\/p>\n<p>Trata-se de uma especializa\u00e7\u00e3o da topologia proposta para trabalhar com um componente mediador. O in\u00edcio das atividades, para o <em>SEC, <\/em>pode ocorrer com um evento inicial e as respostas dos servi\u00e7os especializados ocorre com eventos de conclus\u00e3o.<\/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, quando \u00e9 usado um mecanismo adequado de mensageria, naturalmente <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 <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 <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-5073","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.02 - 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-02\/\" \/>\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.02 - 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-02\/\" \/>\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:01:04+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=\"16 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-02\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/\",\"name\":\"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.02 - 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-02\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg\",\"datePublished\":\"2022-07-07T18:09:06+00:00\",\"dateModified\":\"2024-01-11T21:01:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/#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-02\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/#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-02\/#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.02\"}]},{\"@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.02 - 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-02\/","og_locale":"pt_BR","og_type":"article","og_title":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.02 - 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-02\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T21:01:04+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":"16 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-02\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/","name":"Fundamentos para arquiteturas baseadas em eventos (EDA) \/ Cap\u00edtulo 8 v 1.02 - 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-02\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/alireza-attari-mp_FNJYcjBM-unsplash.jpg","datePublished":"2022-07-07T18:09:06+00:00","dateModified":"2024-01-11T21:01:04+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/#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-02\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquiteturas-baseadas-em-eventos-eda-capitulo-8-v-1-02\/#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-02\/#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.02"}]},{"@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\/5073","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=5073"}],"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=5073"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=5073"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=5073"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=5073"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=5073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}