

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Decomponha monólitos em microsserviços usando o CQRS e o fornecimento de eventos
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

*Rodolfo Jr. Cerrada, Dmitry Gulin e Tabby Ward, Amazon Web Services*

## Resumo
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-summary"></a>

Esse padrão combina dois padrões, usando o padrão de separação de responsabilidade por consulta de comando (CQRS) e o padrão de fornecimento de eventos. O padrão CQRS separa as responsabilidades dos modelos de comando e consulta. O padrão de fornecimento de eventos aproveita a comunicação assíncrona orientada por eventos para melhorar a experiência geral do usuário.

Você pode usar os serviços CQRS e Amazon Web Services (AWS) para manter e escalar cada modelo de dados de forma independente enquanto refatora seu aplicativo monolítico em arquitetura de microsserviços. Em seguida, você pode usar o padrão de fornecimento de eventos para sincronizar dados do banco de dados de comandos com o banco de dados de consulta.

Esse padrão usa um código de exemplo que inclui um arquivo de solução (\$1.sln) que você pode abrir usando a versão mais recente do Visual Studio. O exemplo contém o código da API Reward para mostrar como o CQRS e o fornecimento de eventos funcionam em aplicativos com tecnologia sem servidor e sem servidor, tradicionais ou on-premises da AWS.

Para saber mais sobre o CQRS e o fornecimento de eventos, consulte a seção [Informações adicionais](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

## Pré-requisitos e limitações
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**Pré-requisitos **
+ Uma conta AWS ativa
+ Amazon CloudWatch
+ Tabelas do Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Chave de acesso e chave secreta do AWS Identity and Access Management (IAM); para obter mais informações, acesse o vídeo na seção *Recursos relacionados*
+ AWS Lambda
+ Familiaridade com o Visual Studio
+ *Familiaridade com o AWS Toolkit for Visual Studio; para obter mais informações, consulte *o vídeo de demonstração do AWS Toolkit for Visual Studio* na seção Recursos relacionados*

**Versões do produto**
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/).
+ [AWS Toolkit for Visual Studio 2019](https://aws.amazon.com/visualstudio/).
+ .NET Core 3.1 Esse componente é uma opção na instalação do Visual Studio. Para incluir o .NET Core durante a instalação, selecione **Desenvolvimento multiplataforma NET Core**.

**Limitações**
+ O código de exemplo para um aplicativo on-premises tradicional (ASP.NET Core Web API e objetos de acesso a dados) não vem com um banco de dados. No entanto, ele vem com o objeto `CustomerData` na memória, que atua como um banco de dados simulado. O código fornecido é suficiente para você testar o padrão.

## Arquitetura
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-architecture"></a>

**Pilha de tecnologia de origem**
+ Projeto de API Web do ASP.NET Core
+ Servidor Web IIS
+ Objeto de acesso a dados
+ Modelo CRUD

**Arquitetura de origem**

Na arquitetura de origem, o modelo CRUD contém interfaces de comando e consulta em um aplicativo. Por exemplo, código, consulte `CustomerDAO.cs` (em anexo).

![\[Conexões entre aplicação, interface de serviço, modelo CRUD do cliente e banco de dados.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**Pilha de tecnologias de destino**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ AWS Lambda
+ Amazon API Gateway
+ (Opcional) Amazon Simple Notification Service (Amazon SNS)

**Arquitetura de destino**

Na arquitetura de destino, as interfaces de comando e consulta são separadas. A arquitetura mostrada no diagrama a seguir pode ser estendida com o API Gateway e o Amazon SNS. Para obter mais informações, consulte a seção [Informações adicionais](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

![\[Aplicação conectada aos microsserviços Customer Command e Customer Query sem servidor.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. As funções de comando do Lambda realizam operações de gravação, como criar, atualizar ou excluir, no banco de dados.

1. As funções de consulta do Lambda realizam operações de leitura, como obter ou selecionar, no banco de dados.

1. Essa função do Lambda processa os fluxos do DynamoDB do banco de dados Comando e atualiza o banco de dados Consulta para as alterações.

## Ferramentas
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-tools"></a>

**Ferramentas**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html): o Amazon DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado que fornece uma performance rápida e previsível com escalabilidade integrada.
+ [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html): o Amazon DynamoDB Streams captura uma sequência em ordem temporal de modificações em nível de item em qualquer tabela do Amazon DynamoDB. Esse serviço, então, armazena essas informações em um log por até 24 horas. A criptografia em repouso criptografa os dados em fluxos do DynamoDB.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html): o AWS Lambda é um serviço de computação que permite a execução do código sem provisionar ou gerenciar servidores O Lambda executa o código somente quando necessário e dimensiona automaticamente, desde algumas solicitações por dia até milhares por segundo. Você paga apenas pelo tempo de computação consumido. Não haverá cobranças quando o código não estiver em execução.
+ [Console de Gerenciamento da AWS](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html): o Console de Gerenciamento da AWS é uma aplicação web que compreende uma ampla coleção de consoles de serviço para gerenciar serviços da AWS.
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/): o Visual Studio 2019 é um ambiente de desenvolvimento integrado (IDE). A Community Edition é gratuita para colaboradores de código aberto. Nesse padrão, você usará o Visual Studio 2019 Community Edition para abrir, compilar e executar código de exemplo. Somente para visualização, você pode usar qualquer editor de texto ou o [Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html).
+ [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html): o AWS Toolkit for Visual Studio é um plug-in para o Visual Studio IDE. O AWS Toolkit for Visual Studio facilita o desenvolvimento, a depuração e a implantação de aplicativos .NET que usam os serviços AWS.

**Código **

O código de exemplo está anexado. Para obter instruções sobre como implantar o código de exemplo, consulte a seção *Épicos*.

## Épicos
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-epics"></a>

### Abra e crie a solução
<a name="open-and-build-the-solution"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Abra a solução. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos | 
| Crie a solução. | Abra o menu de contexto (clique com o botão direito do mouse) da solução e selecione **Criar soluções**. Isso criará e compilará todos os projetos na solução. Ele deve ser compilado com sucesso.O Visual Studio Solution Explorer deve mostrar a estrutura de diretórios.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos | 

### Crie as tabelas do DynamoDB
<a name="build-the-dynamodb-tables"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Forneça credenciais | Se você ainda não tem uma chave de acesso, assista ao vídeo na seção *Recursos relacionados*.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos, engenheiro de dados, DBA | 
| Crie o projeto. | **Para criar o projeto, abra o menu de contexto (clique com o botão direito do mouse) para o projeto **AwS.APG.CQRSES.Build** e selecione Construir**. | Desenvolvedor de aplicativos, engenheiro de dados, DBA | 
| Crie e preencha as tabelas. | Para criar as tabelas e preenchê-las com dados iniciais, abra o menu de contexto (clique com o botão direito do mouse) para o projeto **AwS.APG.CQRSES.Build** e então escolha **Depurar**,** Iniciar nova instância**. | Desenvolvedor de aplicativos, engenheiro de dados, DBA | 
| Verifique a construção da tabela e os dados. | Para verificar, navegue até o **AWS Explorer** e expanda o **Amazon DynamoDB**. Ele deve exibir as tabelas. Abra cada tabela para exibir os dados de exemplo. | Desenvolvedor de aplicativos, engenheiro de dados, DBA | 

### Execute testes locais
<a name="run-local-tests"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie o projeto do CQRS. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos, engenheiro de testes | 
| Crie o projeto de fornecimento de eventos. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos, engenheiro de testes | 
| Execute os testes. | Para executar todos os testes, escolha **Exibir**, **Explorador de testes** e, em seguida, escolha **Executar todos os testes na exibição**. Todos os testes devem ser aprovados, o que é indicado por um ícone de marca de seleção verde.  | Desenvolvedor de aplicativos, engenheiro de testes | 

### Publique as funções do CQRS Lambda na AWS
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Publique a primeira função do Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos, DevOps engenheiro | 
| Verifique o upload da função. | (Opcional) Você pode verificar se a função foi carregada com sucesso navegando até o AWS Explorer e expandindo o **AWS Lambda**. Para abrir a janela de teste, escolha a função do Lambda (clique duas vezes). | Desenvolvedor de aplicativos, DevOps engenheiro | 
| Testar a função do Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Todos os projetos Lambda do CQRS são encontrados nas pastas de soluções `CQRS AWS Serverless\CQRS\Command Microservice` e ` CQRS AWS Serverless\CQRS\Command Microservice`. Para o diretório da solução e os projetos, consulte **Diretório de código-fonte** na seção [Informações adicionais](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Desenvolvedor de aplicativos, DevOps engenheiro | 
| Publique as funções restantes. | Repita as etapas anteriores para os seguintes projetos:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos, DevOps engenheiro | 

### Configure a função do Lambda como um receptor de evento
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Publique os manipuladores de eventos Cliente and Recompensa do Lambda. | Para publicar cada manipulador de eventos, siga as etapas do épico anterior.Os projetos estão sob as pastas de soluções `CQRS AWS Serverless\Event Source\Customer Event` e `CQRS AWS Serverless\Event Source\Reward Event`. Para obter mais informações, consulte *Diretório de código-fonte* na seção [Informações adicionais](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Desenvolvedor de aplicativos | 
| Anexe o receptor de eventos Lambda de fornecimento de eventos. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Depois que o receptor for anexado com sucesso à tabela do DynamoDB, ele será exibido na página do designer do Lambda. | Desenvolvedor de aplicativos | 
| Publique e anexe a EventSourceReward função Lambda. | Para publicar e anexar a função `EventSourceReward` Lambda, repita as etapas nas duas histórias anteriores, selecionando na lista suspensa **cqrses-reward-cmd**da tabela do **DynamoDB**. | Desenvolvedor de aplicativos | 

### Teste e valide os fluxos do DynamoDB e o gatilho do Lambda
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Teste o fluxo e o acionador do Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos | 
| Valide usando a tabela de consulta de recompensas do DynamodDB. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos | 
| Valide usando CloudWatch Logs. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desenvolvedor de aplicativos | 
| Valide o EventSourceCustomer gatilho. | Para validar o `EventSourceCustomer` gatilho, repita as etapas desse épico, usando a respectiva tabela de clientes e CloudWatch registros do `EventSourceCustomer` gatilho. | Desenvolvedor de aplicativos | 

## Recursos relacionados
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-resources"></a>

**Referências**
+ [Downloads do Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/)
+ [Download do AWS Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/)
+ [Guia do usuário do AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [Tecnologia sem servidor na AWS](https://aws.amazon.com/serverless/)
+ [Casos de uso e padrões de design do DynamoDB](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [Martin Fowler CQRS](https://martinfowler.com/bliki/CQRS.html)
+ [Fornecimento de eventos de Martin Fowler](https://martinfowler.com/eaaDev/EventSourcing.html)

**Vídeos**
+ [Demo do AWS Toolkit for Visual Studio](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [Como faço para criar um ID de chave de acesso para um novo usuário do IAM?](https://www.youtube.com/watch?v=665RYobRJDY)

## Mais informações
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**CQRS e fornecimento de eventos**

*CQRS*

O padrão CQRS separa um único modelo de operações conceituais, como um único modelo CRUD (criar, ler, atualizar, excluir) de objeto de acesso a dados, em modelos de operações de comando e consulta. O modelo de comando se refere a qualquer operação, como criar, atualizar ou excluir, que altera o estado. O modelo de consulta se refere a qualquer operação que retorna um valor.

![\[Arquitetura com interface de serviço, modelo CRUD e banco de dados.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. O modelo Cliente CRUD inclui as seguintes interfaces:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`

À medida que seus requisitos se tornam mais complexos, você pode abandonar essa abordagem de modelo único. O CQRS usa um modelo de comando e um modelo de consulta para separar a responsabilidade pela gravação e leitura de dados. Dessa forma, os dados podem ser mantidos e gerenciados de forma independente. Com uma separação clara de responsabilidades, os aprimoramentos em cada modelo não afetam o outro. Essa separação melhora a manutenção e o desempenho e reduz a complexidade do aplicativo à medida que ele cresce.

![\[O aplicativo se separou em modelos de comando e consulta, compartilhando um banco de dados único.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. Interfaces no modelo Comando do cliente:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. Interfaces no modelo Consulta do cliente:
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`
   + `GetMonthlyStatement()`

Por exemplo de código, consulte *Diretório de código-fonte*.

O padrão CQRS então separa o banco de dados. Essa dissociação leva à total independência de cada serviço, que é o principal ingrediente da arquitetura de microsserviços.

![\[Bancos de dados separados para modelos de comando e consulta.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 Usando o CQRS na Nuvem AWS, você pode otimizar ainda mais cada serviço. Por exemplo, você pode definir configurações de computação diferentes ou escolher entre um microsserviço com tecnologia sem servidor ou baseado em contêiner. Você pode substituir seu armazenamento em cache local pela Amazon. ElastiCache Se você tiver um sistema de publish/subscribe mensagens local, poderá substituí-lo pelo Amazon Simple Notification Service (Amazon SNS). Além disso, você pode aproveitar os pay-as-you-go preços e a grande variedade de serviços da AWS que você paga somente pelo que usa.

O CQRS inclui os seguintes benefícios:
+ Escalabilidade independente: cada modelo pode ter sua estratégia de escalabilidade ajustada para atender aos requisitos e à demanda do serviço. Semelhante aos aplicativos de alto desempenho, a separação de leitura e gravação permite que o modelo seja dimensionado de forma independente para atender a cada demanda. Você também pode adicionar ou reduzir recursos computacionais para atender à demanda de escalabilidade de um modelo sem afetar o outro.
+ Manutenção independente: a separação dos modelos de consulta e comando melhora a capacidade de manutenção dos modelos. Você pode fazer alterações e aprimoramentos no código de um modelo sem afetar o outro.
+ Segurança: é mais fácil aplicar as permissões e políticas a modelos separados para leitura e gravação.
+ Leituras otimizadas: você pode definir um esquema otimizado para consultas. Por exemplo, você pode definir um esquema para os dados agregados e um esquema separado para as tabelas de fatos.
+ Integração: o CQRS se encaixa bem com modelos de programação baseados em eventos.
+ Complexidade gerenciada: a separação em modelos de consulta e comando é adequada para domínios complexos.

Ao usar o CQRS, tenha em mente as seguintes advertências:
+ O padrão CQRS se aplica somente a uma parte específica de um aplicativo e não a todo o aplicativo. Se implementado em um domínio que não se encaixa no padrão, ele pode reduzir a produtividade, aumentar o risco e introduzir complexidade.
+ O padrão funciona melhor para modelos usados com frequência que têm operações de leitura e gravação desequilibradas.
+ Para aplicativos que exigem muita leitura, como relatórios grandes que demoram para serem processados, o CQRS oferece a opção de selecionar o banco de dados correto e criar um esquema para armazenar seus dados agregados. Isso melhora o tempo de resposta da leitura e visualização do relatório processando os dados do relatório apenas uma vez e despejando-os na tabela agregada.
+ Para aplicativos com muita gravação, você pode configurar o banco de dados para operações de gravação e permitir que o microsserviço de comando seja escalado de forma independente quando a demanda por gravação aumentar. Para ver exemplos, consulte os microsserviços `AWS.APG.CQRSES.CommandRedeemRewardLambda` e `AWS.APG.CQRSES.CommandAddRewardLambda`.

*Origens de eventos*

A próxima etapa é usar o fornecimento de eventos para sincronizar o banco de dados de consultas quando um comando é executado. Por exemplo, considere os seguintes eventos:
+ É adicionado um ponto de recompensa do cliente que exige que os pontos de recompensa totais ou agregados do cliente no banco de dados de consulta sejam atualizados.
+ O sobrenome do cliente é atualizado no banco de dados de comandos, o que exige que as informações do cliente substituto no banco de dados de consulta sejam atualizadas.

No modelo CRUD tradicional, você garante a consistência dos dados bloqueando os dados até que a transação seja concluída. No fornecimento de eventos, os dados são sincronizados por meio da publicação de uma série de eventos que serão consumidos por um assinante para atualizar seus respectivos dados.

O padrão de fornecimento de eventos garante e registra uma série completa de ações realizadas nos dados e os publica por meio de uma sequência de eventos. Esses eventos representam um conjunto de alterações nos dados que os assinantes desse evento devem processar para manter seus registros atualizados. Esses eventos são consumidos pelo assinante, sincronizando os dados no banco de dados do assinante. Nesse caso, esse é o banco de dados de consultas.

O diagrama a seguir mostra o fornecimento de eventos usado com o CQRS na AWS.

![\[Arquitetura de microsserviços para o CQRS e padrões de fornecimento de eventos usando serviços com tecnologia sem servidor da AWS.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. As funções de comando do Lambda realizam operações de gravação, como criar, atualizar ou excluir, no banco de dados.

1. As funções de consulta do Lambda realizam operações de leitura, como obter ou selecionar, no banco de dados.

1. Essa função do Lambda processa os fluxos do DynamoDB do banco de dados Comando e atualiza o banco de dados Consulta para as alterações. Você também pode usar essa função para publicar uma mensagem no Amazon SNS para que seus assinantes possam processar os dados.

1. (Opcional) O assinante do evento Lambda processa a mensagem publicada pelo Amazon SNS e atualiza o banco de dados Consulta.

1. (Opcional) O Amazon SNS envia uma notificação por e-mail sobre a operação de gravação.

Na AWS, o banco de dados de consultas pode ser sincronizado pelo DynamoDB Streams. O DynamoDB captura uma sequência em ordem temporal de modificações em nível de item em uma tabela do DynamoDB em tempo quase real e armazena de forma durável as informações em 24 horas.

A ativação do DynamoDB Streams permite que o banco de dados publique uma sequência de eventos que possibilita o padrão de fornecimento de eventos. O padrão de fornecimento de eventos adiciona o assinante do evento. O aplicativo de assinante do evento consome o evento e o processa de acordo com a responsabilidade do assinante. No diagrama anterior, o assinante do evento envia as alterações para o banco de dados do Query DynamoDB para manter os dados sincronizados. O uso do Amazon SNS, do agente de mensagens e do aplicativo de assinante de eventos mantém a arquitetura desacoplada.

O fornecimento de eventos inclui os seguintes benefícios:
+ Consistência para dados transacionais
+ Uma trilha de auditoria confiável e um histórico das ações, que podem ser usados para monitorar as ações realizadas nos dados
+ Permite que aplicativos distribuídos, como microsserviços, sincronizem seus dados em todo o ambiente
+ Publicação confiável de eventos sempre que o estado mudar
+ Reconstruindo ou reproduzindo estados passados
+ Entidades fracamente acopladas que trocam eventos para migração de um aplicativo monolítico para microsserviços
+ Redução de conflitos causados por atualizações simultâneas; o fornecimento de eventos evita a necessidade de atualizar objetos diretamente no armazenamento de dados
+ Flexibilidade e extensibilidade ao desacoplar a tarefa e o evento
+ Atualizações externas do sistema
+ Gerenciamento de várias tarefas em um único evento

Ao usar o fornecimento de eventos, lembre-se das seguintes ressalvas:
+ Como há algum atraso na atualização dos dados entre os bancos de dados dos assinantes de origem, a única maneira de desfazer uma alteração é adicionar um evento compensador ao armazenamento de eventos.
+ A implementação do sourcing de eventos tem uma curva de aprendizado devido ao seu estilo diferente de programação.

**Dados de teste**

Use os dados de teste a seguir para testar a função do Lambda após a implantação bem-sucedida.

**CommandCreate Cliente**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Done",  "CompanyName":"AnyCompany",  "Address": "USA",  "VIP":true }
```

**CommandUpdate Cliente**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Doe",  "CompanyName":"Example Corp.",  "Address": "Seattle, USA",  "VIP":true }
```

**CommandDelete Cliente**

Insira a ID do cliente como dados da solicitação. Por exemplo, se a ID do cliente for 151, insira 151 como dados da solicitação.

```
151
```

**QueryCustomerList**

Isso está branco. Quando for invocado, ele retornará todos os clientes.

**CommandAddReward**

Isso adicionará 40 pontos ao cliente com ID 1 (Richard).

```
{
  "Id":10101,
  "CustomerId":1,
  "Points":40
}
```

**CommandRedeemReward**

Isso deduzirá 15 pontos para o cliente com ID 1 (Richard).

```
{
  "Id":10110,
  "CustomerId":1,
  "Points":15
}
```

**QueryReward**

Insira o ID do cliente. Por exemplo, insira 1 para Richard, 2 para Arnav e 3 para Shirley.

```
2 
```

**Diretório de código-fonte**

Use a tabela a seguir como guia para a estrutura de diretórios da solução Visual Studio. 

*Diretório de soluções de amostra de código on-premises do CQRS*

![\[Diretório de soluções com serviços de Command e Query expandidos.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**Modelo CRUD do cliente**

Exemplo do código on-premises CQRS\$1CRUD Model\$1Projeto AWS.APG.CQRSES.DAL

**Versão CQRS do modelo Customer CRUD**
+ Comando do cliente: projeto `CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command`
+ Consulta do cliente: projeto `CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query`

**Microsserviços de comando e consulta**

O microsserviço de comando está na pasta da solução `CQRS On-Premises Code Sample\CQRS Model\Command Microservice`:
+ O projeto `AWS.APG.CQRSES.CommandMicroservice` ASP.NET Core API atua como o ponto de entrada onde os consumidores interagem com o serviço.
+ O projeto `AWS.APG.CQRSES.Command` .NET Core é um objeto que hospeda objetos e interfaces relacionados a comandos.

O microsserviço de consulta está na pasta da solução `CQRS On-Premises Code Sample\CQRS Model\Query Microservice`:
+ O projeto `AWS.APG.CQRSES.QueryMicroservice` ASP.NET Core API atua como o ponto de entrada onde os consumidores interagem com o serviço.
+ O projeto `AWS.APG.CQRSES.Query` .NET Core é um objeto que hospeda objetos e interfaces relacionados a consultas.

*Diretório de soluções de código da tecnologia sem servidor CQRS AWS*

![\[Diretório de soluções mostrando os microsserviços e a fonte de eventos expandidos.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

Esse código é a versão da AWS do código on-premises usando os serviços com tecnologia sem servidor da AWS.

Em C\$1 .NET Core, cada função do Lambda é representada por um projeto do.NET Core. No código de exemplo desse padrão, há um projeto separado para cada interface nos modelos de comando e consulta.

**CQRS usando os serviços da AWS**

Você pode encontrar o diretório raiz da solução para o CQRS usando os serviços com tecnologia sem servidor da AWS na pasta `CQRS AWS Serverless\CQRS`. O exemplo inclui dois modelos: Cliente e Recompensa.

As funções de comando do Lambda para Cliente e Recompensa estão nas pastas `CQRS\Command Microservice\Customer` e `CQRS\Command Microservice\Reward`. Eles contêm os seguintes projetos Lambda:
+ Comando do cliente: `CommandCreateLambda`, `CommandDeleteLambda`, e `CommandUpdateLambda`
+ Comando de recompensa: `CommandAddRewardLambda` e `CommandRedeemRewardLambda`

As funções de consulta do Lambda para Customer e Reward são encontradas nas pastas `CQRS\Query Microservice\Customer` e `CQRS\QueryMicroservice\Reward`. Eles contêm os projetos Lambda `QueryCustomerListLambda` e `QueryRewardLambda`.

**Projeto de teste CQRS**

O projeto de teste está na pasta `CQRS\Tests`. Este projeto contém um script de teste para automatizar o teste das funções do Lambda do CQRS.

**Fornecimento de eventos usando serviços da AWS**

Os seguintes manipuladores de eventos do Lambda são iniciados pelos fluxos Cliente e Recompensa do DynamoDB para processar e sincronizar os dados nas tabelas de consulta.
+ A função do Lambda `EventSourceCustomer` é mapeada para a tabela Cliente (`cqrses-customer-cmd`) do fluxo do DynamoDB.
+ A função do Lambda `EventSourceReward` é mapeada para a tabela Recompensa (`cqrses-reward-cmd`) do fluxo do DynamoDB.

## Anexos
<a name="attachments-9f1bc700-def4-4201-bb2d-f1fa27404f15"></a>

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: [ attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)