<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Rodrigo Vazquez Ferreira on Medium]]></title>
        <description><![CDATA[Stories by Rodrigo Vazquez Ferreira on Medium]]></description>
        <link>https://medium.com/@rvf.vazquez?source=rss-2db59a5359b2------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*J2FLVI6pk8bFQzG6GGpqXA.png</url>
            <title>Stories by Rodrigo Vazquez Ferreira on Medium</title>
            <link>https://medium.com/@rvf.vazquez?source=rss-2db59a5359b2------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 28 May 2026 17:08:15 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@rvf.vazquez/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[AWS EventBridge Pipes — criando um EventStore na AWS usando EventBridge Pipes]]></title>
            <link>https://medium.com/@rvf.vazquez/aws-eventbridge-pipes-criando-um-eventstore-na-aws-usando-eventbridge-pipes-e0f3038c090e?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/e0f3038c090e</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Sun, 31 Dec 2023 02:14:04 GMT</pubDate>
            <atom:updated>2023-12-31T02:14:04.732Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo tenho como objetivo trazer uma possibilidade de criação de um EventStore na AWS para uma abordagem Event Sourcing</p><p><strong><em>Persistência de dados</em></strong><em>:</em> para persistir os eventos de nosso eventStore podemos fazer uso do <em>DynamoDb</em></p><p><strong><em>Streaming dos Eventos</em></strong>: para propagarmos as mudanças feitos no nosso DynamoDb (usado na persistência) podemos usar tanto <em>DynamoDb Streams</em> como o Kinesis DataStream</p><p><strong><em>Filtragem , roteamento dos Eventos</em></strong>: para realizar a filtragem, transformação e enriquecimento dos Eventos a ferramenta ideal será o <em>EventBridge Pipes</em>. Permitindo de forma simples padrões avançados para o consumo desses eventos</p><p><strong><em>Solução na AWS</em></strong></p><p><em>Schema do EventStore</em></p><ul><li><em>AggregateId</em>: id da raiz de agregação</li><li><em>EventType</em>: tipo do evento. Exemplos: PedidoFinalizado</li><li><em>EventDatetime</em>: data e hora do evento formato ISO 8601</li><li><em>RawData</em>: JSON com o payload do Evento</li></ul><h3>Referência e Links</h3><ul><li><a href="https://aws.amazon.com/blogs/database/build-a-cqrs-event-store-with-amazon-dynamodb/">Build a CQRS event store with Amazon DynamoDB | Amazon Web Services</a></li><li><a href="https://www.eventstore.com/">EventStoreDB - the state-transition database for data-driven businesses</a></li><li><a href="https://github.com/vladikk/elastic-event-store">GitHub - vladikk/elastic-event-store: A fully serverless event store</a></li></ul><p>https://domaincentric.net/blog/eventstoredb-vs-kafka</p><h3>Conclusão</h3><p>Em Resumo, o EventBridge Pipes é um serviço muito promissor e permite endereçar problemas complexos de filtragem, roteamento , enriquecimento de mensagens e podendo ser um dos componentes chaves para uma implementação de um EventStore na AWS</p><p>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#aws</p><p>#dynamoDb</p><p>#eventBridge</p><p>#eventBridgePipes</p><p>#awscommunity #awscommunitybuilder</p><p>#eventsourcing</p><p>#eventstore</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0f3038c090e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Eventsourcing e EventStore, Projeções, Snapshots]]></title>
            <link>https://medium.com/@rvf.vazquez/eventsourcing-e-eventstore-proje%C3%A7%C3%B5es-snapshots-97b964a220d?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/97b964a220d</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Sun, 31 Dec 2023 01:00:57 GMT</pubDate>
            <atom:updated>2023-12-31T01:00:57.510Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo tenho como objetivo abordar EventSourcing, possibilidades de uso do EventStore, e destacar o uso “quase mandatório” de projeções e Snapshots quando usamos EventSourcing+ EventStore</p><h3>Eventsourcing, relação com Aggregate e seu respectivo Stream</h3><p>Todos os eventos de dominio deveriam estar correlacionados ou gerados no contexto do Aggregate , inclusive quando é realizada sessões de Event Storming um passo importante é a clusterização dos Eventos e comandos no Aggregate <br>Exemplo: Pedido Aceito, Pedido Cancelado (em um Aggregate Pedido), Oferta Feita, Oferta Rejeitada , Oferta Aceita (em um Aggregate de Oferta), pagamento rejeitado, pagamento aprovado, pagamento estornado(em um Aggregate Pagamento</p><h3>Projeções</h3><p>Projeções são extremamente importantes quando usamos EventSourcing, por alguns motivos. Dentre os principais, acesso rápido a uma visão materializada com o ultimo estado do Aggregate</p><p>Exemplos: uso de uma projeção para servir APIs de consulta em cima da raiz de agregação</p><p>Podemos criar múltiplas projeções para um mesmo Aggregate.</p><p>Para criar as projeções precisamos fazer a leitura de todos os eventos do Aggregate</p><h3>Snapshots</h3><p>Snapshots são importantes quando usamos eventsourcing pois conseguimos ter uma “foto” do estado do Aggregate na linha do tempo . Permitindo um reprocessamento dos eventos a partir de um snapshot</p><h3>EventStore</h3><p>Embora não seja obrigatório é muito comum o uso de EventStore quando usamos EventSourcing. Existem inúmeras formas de fazer uso de um EventStore desde uma implementação mais artesanal ou comprando algum produto pronto para essa finalidade</p><h3>Referência e Links</h3><ul><li><a href="https://aws.amazon.com/blogs/database/build-a-cqrs-event-store-with-amazon-dynamodb/">Build a CQRS event store with Amazon DynamoDB | Amazon Web Services</a></li><li><a href="https://www.eventstore.com/">EventStoreDB - the state-transition database for data-driven businesses</a></li></ul><p>https://domaincentric.net/blog/eventstoredb-vs-kafka</p><h3>Conclusão</h3><p>Em Resumo, o uso de eventos e uma arquitetura orientada a eventos(EDA) hoje em dia se torna quase que mandatória para desenvolver aplicações robustas e minimamente desacopladas, porém o uso de EventSourcing tem que ser feito com muita consciência , pensando desde o início quais projeções e / ou Snapshots são essenciais para atender as necessidades mais básicas do negócio</p><p>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#DDD</p><p>#eda</p><p>#eventsourcing</p><p>#microservices</p><p>#eventstore</p><p>#aws</p><p>#awscommunity #awscommunitybuilder</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=97b964a220d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A importância do Aggregates Root — DDD em nossas Aplicações]]></title>
            <link>https://medium.com/@rvf.vazquez/a-import%C3%A2ncia-do-aggregate-root-ddd-em-nossas-aplica%C3%A7%C3%B5es-c0a2de7413d6?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/c0a2de7413d6</guid>
            <category><![CDATA[domain-driven-design]]></category>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Sat, 25 Mar 2023 01:21:29 GMT</pubDate>
            <atom:updated>2023-10-13T19:26:58.604Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo tenho como objetivo destacar a importância de Domain Driven Design, focando no Aggregate Root (raíz de Agregação) e na importância que o mesmo deveria ter em nossas Aplicações</p><p>Os Aggregates deveriam impactar vários aspectos de uma aplicação, como por exemplo: coleções de recursos (APIs) , persistência de dados (repositório), contexto de geração de eventos , escopo de um microservice (geralmente vinculado ao tamanho mínimo de um microservice)</p><h3>Relevância para APIs</h3><p>O Aggregate deveria ser a granularidade padrão para as APIs de negócios, as coleções de recursos deveriam ser baseadas neste nível<br>Abaixo exemplo ilustrativo para uma API de pedidos(Aggregate Pedido)</p><p><strong>Exemplo de URI Template</strong></p><p>“/{bounded-context-name}/v1{Aggregate-name/resource-collection-name}”</p><pre>POST /pedidos<br><br>{<br>  &quot;data_pedido&quot;: &quot;2023-03-23T15:00:00&quot;,<br>  &quot;id_cliente&quot;: 12345,<br>  &quot;itens_do_pedido&quot;: [<br>    {<br>      &quot;id_produto&quot;: 6789,<br>      &quot;valor_unitario&quot;: 10.99,<br>      &quot;quantidade&quot;: 2<br>    },<br>    {<br>      &quot;id_produto&quot;: 4567,<br>      &quot;valor_unitario&quot;: 5.99,<br>      &quot;quantidade&quot;: 3<br>    }<br>  ],<br>  &quot;planejamento_de_entrega&quot;: {<br>    &quot;data&quot;: &quot;2023-03-24&quot;,<br>    &quot;endereco&quot;: &quot;Rua da Amizade&quot;,<br>    &quot;numero&quot;: &quot;123&quot;,<br>    &quot;cidade&quot;: &quot;São Paulo&quot;,<br>    &quot;cep&quot;: &quot;01234-567&quot;<br>  }<br>}<br><br><br>GET /pedidos/:id_pedido<br><br>{<br>  &quot;id_pedido&quot;: 801-7800701-7435808,<br>  &quot;data_pedido&quot;: &quot;2023-03-23T15:00:00&quot;,<br>  &quot;status&quot;: &quot;Em andamento&quot;,<br>  &quot;id_cliente&quot;: 12345,<br>  &quot;itens_do_pedido&quot;: [<br>    {<br>      &quot;id_produto&quot;: 6789,<br>      &quot;valor_unitario&quot;: 10.99,<br>      &quot;quantidade&quot;: 2<br>    },<br>    {<br>      &quot;id_produto&quot;: 4567,<br>      &quot;valor_unitario&quot;: 5.99,<br>      &quot;quantidade&quot;: 3<br>    }<br>  ],<br>  &quot;planejamento_de_entrega&quot;: {<br>    &quot;data&quot;: &quot;2023-03-24&quot;,<br>    &quot;endereco&quot;: &quot;Rua da Amizade&quot;,<br>    &quot;numero&quot;: &quot;123&quot;,<br>    &quot;cidade&quot;: &quot;São Paulo&quot;,<br>    &quot;cep&quot;: &quot;01234-567&quot;<br>  }<br>}<br><br></pre><h3>Relevância para Persistência de Dados</h3><p>O Aggregate é uma fronteira transacional, devido a isso temos sinergia com o pattern Repository</p><p>, Independente se o seu DataStore seja um database relacional ou NoSql , estruturando sua aplicação para que o seu Repositório de dados tenha a granularidade de sua raíz de Agregação e tomando o devido cuidado para que sua Entidade de negócio (Domain Model) não seja contaminada com particularidade do modelo de persistência (criando afinidade indesejada com a tecnologia), podemos ter a felicidade neste modelo de trocar a tecnologia de armazenamento/ banco de dados de forma mais suave, com pouco ou zero impacto em camadas mais core (aplicação e Domain)</p><p><strong>Exemplo modelo NoSql — DynamoDb</strong></p><p>Quando usamos um database NoSQL temos que ter uma atenção mais forte para padrões de acesso para definição de como vamos armazenar</p><p><strong>Tabela</strong>:</p><ul><li><strong><em>Pedido</em></strong><br>Partition Key: idPedido<br>(Podendo variar na modelagem de acordo com padrão de acesso para usar 1 ou N linhas/itens para cada pedido)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1017/1*mV73rEWzcHf4z-VZrggn_A.png" /><figcaption>Exemplo Ilustrativo de Persistencia do Aggregate de Pedido, cada pedido usando apenas um item no dynamo</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/648/1*veP1sK8MMsAlo6afbgSroQ.png" /><figcaption>Exemplo Ilustrativo de Persistencia do Aggregate de Pedido, cada pedido usando N itens no dynamo</figcaption></figure><p><strong>Exemplo modelo SQL</strong></p><p>Em um database relacional teríamos tabelas abaixo , com seus respectivos relacionamentos:</p><ul><li><strong>Pedido </strong>, <strong>item de Pedid</strong>o, <strong>Produto</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ibENQoHdKyyOmd-zpkJ2gw.png" /><figcaption>Exemplo Ilustrativo de Persistencia do Aggregate de Pedido — Modelo Relacional</figcaption></figure><h3>Relevância para Microservices</h3><p>O Aggregates podem ser bom caminho para chegar ao tamanho inicial de um microservice, dado que o Aggregate já é uma fronteira transacional . <br>Vale lembrar que transações não deveriam passar a fronteira do Aggregate</p><p>Este caminho geralmente é sugerido como o<strong><em> tamanho minimo</em></strong> para um microservice, enquanto o<strong><em> </em></strong>Bounded Context é sugerido como o <strong><em>tamanho maximo</em></strong> de um microservice</p><h3>Relevância para Event Driven Architecture</h3><p>Todos os eventos deveriam estar correlacionados ou gerados no contexto do Aggregate , inclusive quando é realizada sessões de Event Storming um passo importante é a clusterização dos Eventos e comandos no Aggregate <br>Exemplo: Pedido Aceito, Pedido Cancelado (em um Aggregate Pedido), Oferta Feita, Oferta Rejeitada , Oferta Aceita (em um Aggregate de Oferta)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yec96k19HaCM3HaLGKE2yQ.jpeg" /><figcaption>Exemplo de clusterização de Eventos no Aggregate Offer- <br>Event Storming</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/875/0*gyyFbH2TtJvA9B-R.png" /><figcaption>Exemplo de clusterização de Eventos no Aggregate Account- <br>Event Storming</figcaption></figure><h3>Conclusão</h3><p>Em Resumo, dado o impacto que a Raíz de Agregação deveria ter nas nossas aplicações devemos ter uma atenção toda especial, dado que ajudam a guiar a construção de APIs de negócios, delimitam os limites transacionais com isso nos dão um bom indicador para quebrar sistemas em microservices</p><p>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#DDD #DDD_Aggregate #MICROSERVICES</p><p>#API #EDA</p><h3>Referências</h3><p>Aggregate:<a href="https://martinfowler.com/bliki/DDD_Aggregate.html"> https://martinfowler.com/bliki/DDD_Aggregate.html</a></p><p>Aggregate Data Store: <a href="https://martinfowler.com/bliki/AggregateOrientedDatabase.html">https://martinfowler.com/bliki/AggregateOrientedDatabase.html</a></p><p>APIs e Aggregate:<br><a href="https://medium.com/@jayadebaj/api-architecture-part-1-an-api-style-guide-through-the-lensapi-architecture-c827fea451bd">https://medium.com/@jayadebaj/api-architecture-part-1-an-api-style-guide-through-the-lensapi-architecture-c827fea451bd</a></p><p>Event Storming e Reactive Systems<br><a href="https://blog.redelastic.com/corporate-arts-crafts-modelling-reactive-systems-with-event-storming-73c6236f5dd7">https://blog.redelastic.com/corporate-arts-crafts-modelling-reactive-systems-with-event-storming-73c6236f5dd7</a></p><p>Desiging DDD Aggregates<a href="https://medium.com/@albert.llousas/designing-ddd-aggregates-db633f1caf88"><br>https://medium.com/@albert.llousas/designing-ddd-aggregates-db633f1caf88</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c0a2de7413d6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Clean Architecture — A essência direto ao ponto]]></title>
            <link>https://medium.com/@rvf.vazquez/clean-architecture-a-ess%C3%AAncia-draft-6d902e10d4b2?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/6d902e10d4b2</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Sat, 28 Jan 2023 18:19:41 GMT</pubDate>
            <atom:updated>2023-03-09T01:40:04.716Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo tenho como objetivo trazer a essência de Clean Architecture, focando no principal, e no mínimo que deveríamos se preocupar para podermos considerar que estamos usando realmente clean Architecture</p><p>Clean Architecture evoluiu ao longo do tempo a partir de várias outras arquiteturas que focavam em desacoplamento, incluindo Arquitetura Hexagonal(Ports and Adapters) e Arquitetura Onion<br>Uncle Bob enfatiza cinco qualidades que todas as arquiteturas predecessoras e a Clean Architecture possuem:</p><ul><li>Independência de framework: a arquitetura é desacoplada de frameworks de terceiros.</li><li>Testável: a arquitetura é fácil de escrever testes de unidade.</li><li>Independência da interface do usuário: a arquitetura pode ser desconectada da interface do usuário</li><li>Independência do banco de dados: a arquitetura é desacoplada do armazenamento de dados subjacente.</li><li>Independência de agentes externos: as regras de negócios da arquitetura são isoladas e nada sabem sobre o mundo exterior.</li></ul><p>Clean Architecture é uma abordagem que permite postergar decisões, onde focamos em construir código de regras de negócio e aplicação , atacamos o coração da aplicação: camadas de aplicação (use cases) e camada de domínio (entidades, Value objects) , com esse modelo de pensamento e construção conseguimos ajustar algum “detalhe técnico&quot; sem precisar alterar o core da aplicação. Exemplo: seria possível trocar o mecanismo de armazenamento/ database de um banco relacional para um não relacional apenas trocando a classe concreta de um entity Gateway/ repository, Clean Architecture pode ser sua grande aliada na construção de arquitetura evolutivas de forma consistente</p><h3>Estrutura Básica</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/772/1*B7LkQDyDqLN3rRSrNYkETA.jpeg" /><figcaption>Estrutura Básica de uma aplicação Clean Architecture</figcaption></figure><p>Semelhante a outras arquiteturas focadas em desacoplamento (onion, hexagonal) , as regras de dependências são sempre do círculo/ camada mais externa para a mais interna. Toda aplicação Clean Architecture deveria respeitar a regra de dependência acima , onde a camada mais interna nunca conhece diretamente a camada externa<br><br>O objetivo do desenvolvimento de software usando o clean é focar no que realmente importa , que são suas regras de negócio (nivel domínio e aplicação).<br> Neste momento não importa SQL , HTML, javascript, modelo de deploy , container , FaaS (lambda) são detalhes, a “tecnologia é um detalhe”<br><br>Pegando a fala do uncle bob</p><ul><li>Database é um detalhe</li><li>Web é um detalhe</li><li>Protocolo de exposição ou comunicação é um detalhe</li></ul><h4>Entidades</h4><p>As entidades encapsulam as regras de negócios. Uma entidade pode ser um objeto com métodos ou pode ser um conjunto de funções e estruturas de dados , as entidades são os objetos de negócios do aplicativo. Elas encapsulam as regras mais gerais e de alto nível , que são menos propensas a mudar quando algo externo muda. Por exemplo, você não esperaria que esses objetos fossem afetados por uma alteração na navegação da página ou na segurança. Nenhuma mudança operacional em qualquer aplicativo específico deve afetar a camada de entidade. Pode pensar nelas como Entidades do DDD (Domain Driven Design)</p><h4>Use Cases</h4><p>Regras de aplicação, necessidade de casos de uso</p><p>O software nesta camada contém regras de negócios específicas da aplicação. Esta camada encapsula e implementa todos os casos de uso do sistema. Esses casos de uso orquestram o fluxo de dados de e para as entidades e direcionam essas entidades para usar suas regras de negócios em toda a empresa para atingir os objetivos do caso de uso.</p><p>Não esperamos que mudanças nesta camada afetem as entidades. Também não esperamos que essa camada seja afetada por alterações nas externalidades, como o banco de dados, a interface do usuário ou qualquer uma das estruturas comuns. Esta camada é isolada de tais preocupações.</p><p>No entanto, esperamos que as alterações na operação do aplicativo afetem os casos de uso e, portanto, o software nesta camada. Se os detalhes de um caso de uso mudarem, algum código nessa camada certamente será afetado.</p><h4>Interface adapters (Controller, presenters, Gateway)</h4><p>Aqui estamos falando da camada de implementação de adaptadores para o mundo externo (portas de entrada e portas de saída)<br>Está camada é responsável por converter e formatar dados para uso adequado ao use case e tratar cenários de persistência e conversões necessárias</p><h3>Pontos importantes sobre aspectos de implementação</h3><h4>Diagrama de Classes referência</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*jqXaL8ZRYKIM2K5NQFbtkA.png" /><figcaption>Diagrama de Classes referência (Uncle Bob)</figcaption></figure><h4>Entidade</h4><p>Na camada de domínio , devemos manter um domínio rico e não ter entidades anêmicas. Significa que devemos manter regras que dependem apenas de atributos da entidade em métodos da entidade. Dicas:</p><ul><li>Além da entidade devemos fazer uso de value objects (evitando a obsessão por tipos primitivos)</li><li>Onde deveríamos gerar eventos de domínio ? Por que não nas entidades em métodos da entidade?</li><li>Podemos ter serviços de domínio se for necessário, regras que não cabem a uma única entidade</li></ul><h4>Implementação do use case</h4><p>Independente do nome que seja usado(Interactor, UseCaseImpl , etc):</p><ul><li>Deveria possuir um único método público (por exemplo “execute(request) : response&quot;)</li><li>Recebe Request Model<br>Transforma para entidades / tipos do domínio</li><li>Pode aplicar regras que não cabem na entidade</li><li>Podem manipular / despachar eventos para outros contextos (bounded context) ou microservices</li><li>Retorna response model</li></ul><h4>Request / Response Models</h4><ul><li>São tipos e estruturas de dados para atender um caso de uso específico (uma espécie de DTO (Data transfer Objects))</li><li>Não deveriam possuir atributos/ anotações de Frameworks específicos (exemplos: não colocar anotações para serialização, caso precise de algo do gênero configure convenções de serialização do Framework)</li><li>Ajudam a blindar o Domain Model, através dos request e response Models evita o risco de expor objetos de domínio por engano, prevenindo quebra de contratos por mudança de domínio e vazamento de informações de domínio não aplicáveis ao caso de uso</li></ul><h4>Camada de Gateway / Data Provider</h4><p>Camada responsável por acessar ou prover dados para a aplicação. Dicas para implementação:</p><ul><li>Deveria ter a granularidade da raiz de Agregação</li><li>A entrada e saída dos métodos das interfaces do Gateways deveriam ser sempre objetos do domínio (geralmente Entidades)</li><li>Traduz Entidade/ tipos de domínio para necessidades de comunicação externa(serviços) ou ORM</li><li>Pode conter persistence model (entidades para o orm) internamente se fizer sentido, exemplo: dependendo das capacidades do Framework de ORM para cenários mais simples o modelo de persistência é opcional</li><li>Nesta camada deve-se fazer projeções quando necessário (evitar trazer todos os campos do banco de dados)</li><li>Nesta camada implementamos a classe concreta que implementa a Gateway Interface, onde deveríamos receber na entrada tipos de domínio e retornar tipos de domínio (geralmente entidades)</li></ul><h4>Sugestões de Tipos de Objetos por Pasta / Package / Namespace</h4><h4>Domain</h4><ul><li>Entidades</li><li>Values Objects</li><li>Domain Events</li><li>Gateway Interfaces</li><li>Domain Services (quando existir/ necessário)</li></ul><h4>Application</h4><ul><li>Use Cases Interfaces</li><li>Use Cases Implementation</li><li>Request Models</li><li>Response Models</li><li>Mappers</li><li>Mappers.From(RequestModel).To(Domain)</li><li>Mappers.From(Domain).To(ResponseModel)</li></ul><h4>Infraestrutura</h4><ul><li>Entity Gateway Implementation</li><li>Persistence Models</li><li>Modelos de Interfaces Externas</li><li>Mappers (domínio=&gt;externo | externo=&gt; domínio)</li></ul><h3>Conclusão</h3><p>Em Resumo, a abordagem proposta por Clean Architecture é muito útil pensando em construir software mais perenes, com maior flexibilidade e facilidade de evolução, que facilite uma arquitetura evolutiva. Atenção para não usar Clean Architecture como bala de prata e querer usar para qualquer projeto</p><p>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#cleanarchitecture #cleancode #ddd #evolutionaryarchitecture</p><h3>Referências</h3><p>Uncle Bob Blog: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html</p><p>Livro: Clean Architecture: A Craftsman’s Guide to Software Structure — ISBN: 0134494164</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6d902e10d4b2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Redshift Spectrum- Evitando Carga de Dados no DW através do Redshift Spectrum]]></title>
            <link>https://medium.com/@rvf.vazquez/redshift-spectrum-54bd00ca5291?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/54bd00ca5291</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 21:45:53 GMT</pubDate>
            <atom:updated>2023-05-06T14:23:59.365Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo tenho como objetivo trazer um pouco sobre redshift Spectrum e como ele pode ser útil em abordagens de Lakehouse na AWS, evitando pipelines de dados para consumo de dados que já estejam em um Data Lake(S3) e tenham como destino de consumo o DW (REDSHIFT)</p><h3>Lake House approach</h3><p>Antes de falar especificamente do RedShift, abaixo segue um resumo de Lakehouse<br><br>Como uma arquitetura de dados moderna, a abordagem da Lake House não se trata apenas de integrar seu data lake e seu data warehouse, mas também de conectar seu data lake, seu data warehouse e todos os seus outros serviços específicos em um todo coerente. O data lake permite que você tenha um único local para executar análises na maioria dos seus dados, enquanto os serviços de análise de propósito específico (purpose-built data services) fornecem a velocidade necessária para casos de uso específicos, como painéis em tempo real e análises de log.</p><p>Esta abordagem Lake House consiste nos seguintes elementos-chave:</p><ul><li>Scalable Data Lakes</li><li>Purpose-built Data Services</li><li>Seamless Data Movement</li><li>Unified Governance</li><li>Performant and Cost-effective</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*CSkPXUVSFQcetxWh6XLoGA.jpeg" /><figcaption>5 camadas lógicas de uma arquitetura Lakehouse</figcaption></figure><h3>Lake House reference architecture on AWS</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*wvRvVhmaMlSLZEKxFA8OKQ.jpeg" /><figcaption>Arquitetura de referência de Lakehouse na AWS</figcaption></figure><h3>RedShift Spectrum</h3><p>O Redshift Spectrum é uma das peças centrais da camada de armazenamento Lake House integrada nativamente.</p><blockquote>O Redshift Spectrum permite que o Amazon Redshift apresente uma interface SQL unificada que pode aceitar e processar instruções SQL em que a mesma consulta pode referenciar e combinar conjuntos de dados hospedados no data lake, bem como armazenamento de data warehouse. O Amazon Redshift pode consultar petabytes de dados armazenados no Amazon S3 usando uma camada de até milhares de nós transitórios do Redshift Spectrum e aplicando as sofisticadas otimizações de consulta do Amazon Redshift. O Redshift Spectrum pode consultar dados particionados no data lake S3. Ele pode ler dados compactados usando codec de código aberto e armazenados em linha ou formatos colunares de código aberto, incluindo JSON, CSV, Avro, Parquet, ORC e ​​Apache Hudi.</blockquote><h3>Pré-requisitos</h3><p>Para usar o Redshift Spectrum, é necessário um <em>cluster </em>do Amazon Redshift/ <strong>RedShif Serverless </strong>e um cliente SQL conectado ao cluster, de modo que você possa executar comandos de SQL. O cluster e os arquivos de dados do Amazon S3 devem estar localizados na <strong><em>mesma Região da AWS</em></strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*-8ay2IScphHIH-Oqrg5n_A.gif" /><figcaption>Exemplo REDSHIFT acessando catálogo Glue com objetos do S3</figcaption></figure><h4>Exemplo de Passo a passo</h4><pre>create external schema myspectrum_schema<br>from data catalog<br>database &#39;myspectrum_catalogodb&#39;<br>iam_role &#39;arn:aws:iam....&#39;<br>create external database if not exists;<br></pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/1*2JbklPorIJG9JHjdB7_HJA.png" /><figcaption>Criação do schema para o Spectrum apontando para o Data Catalog(Glue Catalog)</figcaption></figure><pre>create external table myspectrum_schema.sales(<br>salesid integer,<br>listid integer,<br>sellerid integer,<br>buyerid integer,<br>eventid integer,<br>dateid smallint,<br>qtysold smallint,<br>pricepaid decimal(8,2),<br>commission decimal(8,2),<br>saletime timestamp)<br>row format delimited<br>fields terminated by &#39;\t&#39;<br>stored as textfile<br>location &#39;s3://[meu-buckect]/tickit/spectrum/sales/&#39;<br>table properties (&#39;numRows&#39;=&#39;172000&#39;);</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/853/1*_6bhiuBB_SOd71Q25LfmQQ.png" /><figcaption>criação de tabela externa</figcaption></figure><pre>SELECT * FROM &quot;dev&quot;.&quot;myspectrum_schema&quot;.&quot;sales&quot;;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vOazc7UCV-Vcpp_Tw3iggw.png" /><figcaption>Consultando os Dados da tabela externa</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ntijiibo352-3-RpRJ252A.png" /><figcaption>Consultando a mesma tabela no Athena</figcaption></figure><h3>Casos de uso</h3><p>O REDSHIFT spectrum se torna útil em cenários onde temos um data lake (S3), que possui dados úteis ou que complementem dados que estejam no DW(Data Warehouse). Desta forma, conseguimos evitar pipelines de dados para consumir esses dados no DW</p><h3>Conclusão</h3><p>Em Resumo, o REDSHIFT Spectrum pode ser um bom aliado na sua estratégia de analytics quando possui workloads e padrões de consumo da informação em uma abordagem DW / Lakehouse, evitando trabalho na construção de mais pipelines, replicação de dados , custo de armazenamento</p><p>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#AWS #ANALYTICS #REDSHIFT #LAKEHOUSE</p><p>#awscommunity #awscommunitybuilder</p><h3>Referências</h3><p>https://docs.aws.amazon.com/pt_br/redshift/latest/dg/c-getting-started-using-spectrum.html</p><p>https://docs.aws.amazon.com/pt_br/redshift/latest/dg/c-getting-started-using-spectrum-query-s3-data.html</p><p>https://aws.amazon.com/blogs/big-data/build-a-lake-house-architecture-on-aws/</p><p>https://aws.amazon.com/blogs/big-data/harness-the-power-of-your-data-with-aws-analytics/</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=54bd00ca5291" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda — Agrupando funções de forma Sensata]]></title>
            <link>https://medium.com/@rvf.vazquez/aws-lambda-agrupando-fun%C3%A7%C3%B5es-de-forma-sensata-efda7505c2d6?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/efda7505c2d6</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 21:42:44 GMT</pubDate>
            <atom:updated>2023-01-22T17:44:57.795Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo tenho como objetivo falar um pouco de FaaS , em específico sobre AWS Lambda e abordagens de agrupamento de funções em repositórios e projetos , unidades de Deploy</p><p>Serverless veio para ficar e pode ser considerado tranquilamente como uma opção padrão para muitos tipos de workloads, porém dependo de como estruturarmos os projetos podemos acabar em dezenas de projetos e bases de código apenas para um sub-domínio pequeno</p><h3>SAM — Serverless Application Model</h3><p>AWS SAM pode ser usado para projetos de qualquer tamanho, mas é particularmente útil para projetos de médio a grande porte, pois fornece uma estrutura para gerenciar e organizar os recursos do seu aplicativo de maneira eficiente. Além disso, o AWS SAM fornece uma linguagem de modelagem simples que permite definir seus recursos de serviço sem servidor de maneira clara e concisa, o que facilita a manutenção e a depuração do código.</p><p>O SAM além facilitar o IAC, pode ajudar a endereçar o problema de inúmeras funções, simplificando o deploy</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4jHfAy1vJCdvSivH0JKjbg.png" /><figcaption>Modelos de agrupamento de funções em um projeto AWS SAM</figcaption></figure><h3>Microservice-Based Templates</h3><p>Dos modelos expostos acima , o que mais me agrada é o modelo baseado em microservice, onde podemos agrupar todas as funções , recursos Serverless, configuração de event sourcing contidas no microservice. Desta forma, simplifica muito o número de templates de IAC, repositórios de código, esteiras e etc.</p><p>Podemos ter microservice de vários tamanhos dependendo da necessidade e maturidade da organização, desde um microservice maior (orientado ao bounded context) como podemos ter microservice menores (orientado ao Aggregate Root) .</p><p>Entendo que quando temos microservice no nível de uma raiz de agregação (considerado como um caminho para o menor tamanho de um microservice) faz muito sentido usar o SAM para agrupar todos os recursos do mesmo.</p><h3>Conclusão</h3><p>Em Resumo, podemos fazer uso de FaaS e AWS Lambda para uma melhor eficiência computacional e simplificar a operação sem deixar nossa base de código complexa <br><br>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#AWS #FaaS #Lambda #DDD #Microservice #DDD_Aggregate</p><h3>Referências:</h3><h4>Organizando aplicações Serverless</h4><p>https://aws.amazon.com/blogs/compute/best-practices-for-organizing-larger-serverless-applications/</p><h4>Padrões de uso do SAM</h4><p>https://serverlessland.com/patterns?framework=SAM</p><h4>Microservice orientados a raíz de Agregação (Aggregates)</h4><p>https://martinfowler.com/bliki/DDD_Aggregate.html</p><p>https://medium.com/@unmeshvjoshi/aggregate-oriented-microservices-d314eb04f2b1</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=efda7505c2d6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Filtrando mensagens/Eventos na AWS]]></title>
            <link>https://medium.com/@rvf.vazquez/filtrando-mensagens-eventos-na-aws-192ac06cf6d0?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/192ac06cf6d0</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 21:41:46 GMT</pubDate>
            <atom:updated>2023-03-18T16:49:26.403Z</atom:updated>
            <content:encoded><![CDATA[<p>Neste artigo, tenho por objetivo passar um pouco de contexto de mensageria na AWS e alternativas para filtrar as mensagens usando serviços AWS, analisando alternativas para cada serviço de mensageria</p><h3>SNS -&gt; SQS (Fanout)</h3><p>Quando usamos o SNS, podemos aplicar o conceito de Fanout usando subscription(assinatura do tópico SNS) e aplicando filtro na configuração da subscription, podemos ter uma fila SQS assinando um tópico SNS, aplicando o filtro na configuração dessa subscription</p><pre>GreenHighQueueSubscription:<br>	    Type: AWS::SNS::Subscription<br>	    Properties:<br>	      Endpoint: !GetAtt GreenHighQueue.Arn<br>	      Protocol: sqs<br>	      FilterPolicy:<br>	        color:<br>	          - green<br>	        number:<br>	        - numeric:<br>	          - &quot;&gt;&quot;<br>	          - 100<br></pre><h3>Amazon MQ(rabbit MQ)</h3><p>Quando usamos Amazon MQ(flavor Rabbit MQ), com o Rabbit temos um recurso chamado EXCHANGE que permite distribuir a mensagem entre múltiplas filas<br>Além dos recursos nativos do Rabbit é possível usar o recurso de filtro no event sourcing mapping de Lambda</p><h3>Eventbridge</h3><p>Com o Eventbridge podemos usar o recurso de Eventbridge Rules, EventBridge Pipes, ou opção de filtro na configuração de Eventsourcing Mapping das Lambdas</p><h3>Kinesis Data Stream</h3><p>Usando o Kinesis DataStream podemos aplicar filtros em mapeamento de Eventsourcing de Lambdas ou usando EventBridge Pipes, dependendo do cenário(um pouco mais orientado a streaming) podemos usar também o Firehose e o Kinesis Analytics para aplicar filtro de mensagens</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ehMEZVhXsPzK7VkvsqSUGw.png" /><figcaption>Filtrando com Kinesis Analytics</figcaption></figure><h3>Lambda Event Source Mapping — Filter</h3><p>Filtrando mensagens usando o ESM da Lambda , compatível com SQS, DynamoDb Stream, Kinesis , MSK(kafka)<br><br>Filter pattern</p><pre>{<br>    &quot;partitionKey&quot;: [ &quot;1&quot; ],<br>    &quot;data&quot;: {<br>        &quot;Location&quot;: [ &quot;Los Angeles&quot; ]<br>    }<br>}<br></pre><h3>Event Bridge Pipes</h3><p>Por último e não menos importante temos o Event Bridge Pipes que é um serviço novo da AWS e muito promissor. EventBridge Pipes permite conectar fluxos de dados de mensagens , permitindo filtros, enriquecimento e transformações simples até direcionar ao destino</p><h3>Conclusão</h3><p>Em Resumo, usando alguns dos padrões citados acima conseguimos filtrar mensagens de forma eficiente sem a necessidade de aplicar o filtro das mensagens na aplicação consumidora, economizando tráfego de dados e evitando desperdícios de computação para aplicar filtros em cima das mensagens</p><p>#AWS #EDA #INTEGRATION #AWSLAMBDA #AWSCOMMUNITY</p><h3>Referências</h3><p>https://aws.amazon.com/blogs/compute/implementing-architectural-patterns-with-amazon-eventbridge-pipes/</p><p>https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html</p><p>https://aws.amazon.com/about-aws/whats-new/2022/03/amazon-eventbridge-rule-filtering-transformation-console/</p><p>https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html</p><p>https://aws.amazon.com/eventbridge/pipes/</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=192ac06cf6d0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Turbot SteamPipe — Fazendo Selects na sua Cloud]]></title>
            <link>https://medium.com/@rvf.vazquez/steampipe-fazendo-selects-na-sua-cloud-2b06f8f119a3?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/2b06f8f119a3</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 16:16:40 GMT</pubDate>
            <atom:updated>2023-01-14T18:11:10.044Z</atom:updated>
            <content:encoded><![CDATA[<p>o SteamPipe é uma ótima ferramenta para consulta rápida de recursos na cloud , exemplo: AWS</p><blockquote>Turbot Steampipe é uma ferramenta de gerenciamento de infraestrutura em nuvem, desenvolvida pela Turbot Inc, que ajuda as empresas a automatizar e otimizar suas operações de nuvem. Ela inclui recursos como gerenciamento de configuração, governança de segurança, conformidade e compliance, além de automação de provisionamento e escalabilidade. A ferramenta é compatível com várias plataformas de nuvem, incluindo AWS, Azure, e Google Cloud.</blockquote><h4>Plug-ins</h4><p><strong>steampipe plugin install aws</strong></p><p><strong>steampipe query</strong></p><p><em>Consulta de Buckets para verificar se o bucket_policy esta público</em></p><pre>select   name,   region,   account_id,   bucket_policy_is_public from   aws_s3_bucket;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uUl_DCd_FZl_FIyWaq5ffQ.png" /><figcaption>lista de buckets onde um deles está público</figcaption></figure><p><em>Consulta de Tabela Dynamo sem backup ativado</em></p><pre>select<br>  name,<br>  continuous_backups_status<br>from<br>  aws_dynamodb_table<br>where<br>  continuous_backups_status = &#39;DISABLED&#39;;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/503/1*AWV8tdFuUGChXJ_KoM7koQ.png" /><figcaption>Tabelas sem backup ativado</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/556/1*vJ_freC7XI3uLKiNNlNu1g.png" /><figcaption>tabelas com backup ativado</figcaption></figure><p><em>APIs gateways configurados como endpoints não privados</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Nyg-Zy6tSrb4LZoYu4cE_A.png" /><figcaption>APIs com endpoint não privado</figcaption></figure><h4>Referencia e Links</h4><ul><li><a href="https://hub.steampipe.io/">Steampipe Hub</a></li><li><a href="https://hub.steampipe.io/plugins/turbot/aws">Amazon Web Services plugin | Steampipe Hub</a></li></ul><h3>Conclusão</h3><p>Em Resumo, com o SteamPipe podemos fazer querys rapidas para verificar se alguma regra esta sendo violada de forma exploratória como se tivesse consultando tabelas de uma banco de dados</p><p>Em outros artigos podemos explorar com mais detalhes outros recursos e características</p><p>Obrigado pela leitura , Abraços<br>As opiniões citadas nesse artigo são minhas.</p><p>#AWS #SteamPipe #Turbot #Compliance</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2b06f8f119a3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DynamoDb — Dicas de Modelagem , indo Além do básico]]></title>
            <link>https://medium.com/@rvf.vazquez/dynamodb-dicas-de-modelagem-indo-al%C3%A9m-do-b%C3%A1sico-b3a127ec16b8?source=rss-2db59a5359b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/b3a127ec16b8</guid>
            <dc:creator><![CDATA[Rodrigo Vazquez Ferreira]]></dc:creator>
            <pubDate>Sun, 11 Sep 2022 00:06:17 GMT</pubDate>
            <atom:updated>2022-09-11T00:12:57.960Z</atom:updated>
            <content:encoded><![CDATA[<h3>DynamoDb — Dicas de Modelagem , indo Além do básico</h3><p>Neste artigo, tenho por objetivo passar um pouco de contexto de banco de dados, e como o banco de dados DynamoDB pode ser muito útil para endereçar inumeros problemas do dia a dia fazendo uso de alguns padrões de modelagem, indo um pouco além do básico chave/valor / documento</p><p>No Passado para todos os problemas usavamos sempre bancos de dados relacional (one-size fits all)</p><p>Hoje temos novos desafios que precisam ser endereçados como milhões de requests por segundo, latências sub-milisegundo, disarter recovery, acesso global(multi-região) , e etc. Hoje Temos inúmeros bancos de dados disponíveis para cada propósito: chave/valor, documento, grafo, etc.</p><p>O DynamoDb é um banco de dados NoSQL , Serverless, com foco principal em atender cenários chave-valor e documento, com latência de 1 digito de milisegundo, disponibilidade global de forma simplificada(usando o recurso Global Table) , Além de ser muito flexível, permitindo inúmeros padrões de modelagem</p><p>O DynamoDB é um banco de dados schemaless(sem estrutura definida), onde temos a obrigatoriedade apenas da chave primaria, todos os demais atributos são opcionais, onde cada registro pode possuir sua própria estrutura</p><h4><strong>Primary Key</strong></h4><p><em>Simple primary keys</em><br>Composta por um único atributo que é a partition Key</p><p><em>Composite Primary Key</em><br>Composta por dois atributos que são chamados de partition Key + sort key</p><h4><strong>Índices</strong></h4><p><strong>LSI</strong><br>Local Secundary Index é um tipo de índice onde mantemos a mesma chave de partição da PK , porém com outra sort key</p><p><strong>GSI</strong><br>Com o Global Secundary Index, podemos alterar a chave de partição , permitindo muita flexibilidade através da SortKey(exemplo: padrão composite SortKey)</p><h4><strong>Padrões de Modelagem</strong></h4><p>Devido ao fato da chave primária ser composta pela PartitionKey e SortKey(opcional) e permitindo que cada Item ou registro seja uma Entidade diferente. Conseguimos através de técnicas específicas tratar desde cenários mais simples de chave/valor, documento até relações 1:N , N:N , permitindo diversos tipos pesquisas</p><p><strong><em>Principais padrões:</em></strong> Single-Table, Multi-Table<br><strong><em>Estratégias para relações 1: N , N:N </em></strong>: PrimaryKey+Query , Composite Sort Key, Adjacent List</p><p><strong>Single-Table</strong></p><p>o Padrao Single-Table é o padrão de modelagem onde todas as entidades da sua aplicação/ microservice são armazenadas em uma única tabela, embora seja útil em alguns cenários , devemos usar com muita moderação (pode criar complexidade para tratar multiplas entidades, dificulta o uso do DynamoDb Streams)</p><p><strong>Multi-Table</strong></p><p>E a abordagem mais simples , onde criamos uma tabela para cada documento, exemplo: Pedido , Nota Fiscal, Contrato</p><p><strong>Primary key + query</strong></p><p>Use uma chave primária composta para incluir a entidade pai(usando a partitionKey) e entidades relacionadas (usando a SortKey) na mesma coleção de itens. Este é o padrão de relacionamento <em>um para muitos mais comum</em>. Pense na busca pela partition Key como uma entidade raiz de agregação e quando necessário use na busca a PK+SK (opcional)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/649/1*z4uBwdn2ZEwxS8yweKypqw.png" /></figure><p><strong>Composite Sort Key</strong></p><p>Padrão de modelagem usado quando temos dados hierárquicos, onde temos uma concatenação de elementos na SortKey. <br>Exemplo: StatusPedido#DataPedido</p><p>Através desse padrão conseguimos fazer busca begin_with(semelhante ao Like)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/605/1*SmUd0QZv9tyWZLjnHXGi_Q.png" /></figure><p><strong>Adjacent List</strong></p><p>Modele cada entidade como um tipo de item e modele o relacionamento como um tipo de item. Um lado do relacionamento está na mesma coleção de itens para o chave primária, e o outro lado está na mesma coleção de itens em um índice secundário. Usado no relacionamento <em>muitos para muitos</em>. (comum criação de índice invertido(GSI invertendo PK E SK)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/941/1*d4oGN9vXsNsFX74paPHlCQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/754/1*lKQNiz3Hj2-j-lVZo92Zbw.png" /></figure><h4><strong>Referência</strong></h4><ul><li><a href="https://aws.amazon.com/blogs/database/single-table-vs-multi-table-design-in-amazon-dynamodb/">Single-table vs. multi-table design in Amazon DynamoDB | Amazon Web Services</a></li><li><a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html">Best practices for managing many-to-many relationships in DynamoDB tables</a></li></ul><h4><strong>Conclusão</strong></h4><p>Em Resumo , o DynamoDB é um banco de dados poderoso , muito flexível , e pode endereçar vários problemas transacionais que no passado usavamos somente o banco de dados relacional. Conhecendo bem os padrões de acesso pode ser uma ótima ferramenta na construção de aplicações modernas</p><p>Em outros artigos podemos explorar com mais detalhes outros recursos e características</p><p>Obrigado pela leitura , Abraços</p><p>As opiniões citadas nesse artigo são minhas.</p><p>#AWS #DynamoDB</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b3a127ec16b8" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>