Decomponha monólitos em microsserviços usando o CQRS e o fornecimento de eventos - Recomendações da AWS

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

Criado por Rodolfo Jr. Cerrada (AWS), Dmitry Gulin (AWS) e Tabby Ward (AWS)

Ambiente: PoC ou piloto

Origem: Monolith CRUD

Destino: Microsserviços

Tipo R: redefinir arquitetura

Workload: código aberto

Tecnologias: modernização; mensagens e comunicações; tecnologia sem servidor

Serviços da AWS: Amazon DynamoDB; AWS Lambda; Amazon SNS

Resumo

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 (*.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.

Pré-requisitos e limitações

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

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

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 aplicativo, interface de serviço, modelo CRUD do cliente e banco de dados.

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.

Aplicativo conectado aos microsserviços Customer Command e Customer Query sem servidor.
  1. As funções de comando do Lambda realizam operações de gravação, como criar, atualizar ou excluir, no banco de dados.

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

  3. 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

Ferramentas

  • Amazon DynamoDB: 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: 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: 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: 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: 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.

  • AWS Toolkit for Visual Studio: 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

TarefaDescriçãoHabilidades necessárias

Abra a solução.

  1. Baixe o código-fonte de exemplo (CQRS-ES Code.zip) na seção Anexos e extraia os arquivos.

  2. No IDE do Visual Studio, escolha Arquivo, Abrir, Solução do Projeto e navegue até a pasta em que você extraiu o código-fonte.

  3. Escolha AWS.APG.CQRSES.sln, e então escolha Abrir. A solução inteira é carregada no Visual Studio.

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.

  • CQRS On-Premises Code Sample contém um exemplo de uso do CQRS on-premises.

  • CQRS AWS Serverless contém todo o código de exemplo de CQRS e de fornecimento de eventos usando os serviços com tecnologia sem servidor da AWS.

Desenvolvedor de aplicativos
TarefaDescriçãoHabilidades necessárias

Forneça credenciais

Se você ainda não tem uma chave de acesso, assista ao vídeo na seção Recursos relacionados.

  1. No Solution Explorer, expanda CQRS AWS Serverless e, em seguida, expanda a pasta da solução Build.

  2. Expanda o projeto AwS.APG.CQRSES.Build e exiba o arquivo Program.cs.

  3. Mova a barra de rolagem até o topo da Program.cs e procure por Program().

  4. Substitua YOUR ACCESS KEY pela chave de acesso à sua conta e substitua YOUR SECRET KEY pela chave secreta da sua conta. Observe que, em um ambiente de produção, você não codificaria suas chaves. Em vez disso, você pode usar o AWS Secrets Manager para armazenar e recuperar as credenciais.

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
TarefaDescriçãoHabilidades necessárias

Crie o projeto do CQRS.

  1. Abra a solução e navegue até a pasta da solução CQRS AWS Services/CQRS/Tests.

  2. No projeto aws.apg.cqrses.cqrslambda.tests, abra .cs e substitua e pelas chaves do IAM que você criou. BaseFunctionTest AccessKeySecretKey

  3. Salve as alterações.

  4. Para compilar e criar o projeto de teste, abra o menu de contexto (clique com o botão direito do mouse) do projeto e selecione Construir.

Desenvolvedor de aplicativos, engenheiro de testes

Crie o projeto de fornecimento de eventos.

  1. Navegue até a pasta da solução CQRS AWS Services/Event Source/Tests

  2. No AWS.APG.CQRSES. EventSourceLambda.Testa o projeto, abra BaseFunctionTest.cs e substitua AccessKeye pelas SecretKeychaves do IAM que você criou. 

  3. Salve as alterações.

  4. Para compilar e criar o projeto de teste, abra o menu de contexto (clique com o botão direito do mouse) do projeto e selecione Construir.

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
TarefaDescriçãoHabilidades necessárias

Publique a primeira função do Lambda.

  1. No Solution Explorer, abra o menu de contexto (clique com o botão direito do mouse) do AWS.APG.CQRSES. CommandCreateLambda projeto e, em seguida, escolha Publicar no AWS Lambda.

  2. Selecione o perfil que você deseja usar e a região da AWS em que deseja implantar a função do Lambda e o nome da função.

  3. Mantenha os padrões de valores para os campos restantes e escolha Next (Avançar).

  4. Na lista suspensa Nome da função, selecione. AWSLambdaFullAccess

  5. Para fornecer as chaves da sua conta, escolha Adicionar e insira AcessKey como variável e sua chave de acesso como valor. Em seguida, escolha Adicionar novamente, insira SecretKey como variável e sua chave secreta como valor.

  6. Mantenha os padrões de valores para os campos restantes e escolha Upload (Carregar). Depois que a função de teste do Lambda é carregada, ela aparece automaticamente no Visual Studio.

  7. Repita as etapas de 1 a 6 para os seguintes projetos:

    • AWS.APG.CARSES. CommandDeleteLambda

    • AWS.APG.CARSES. CommandUpdateLambda

    • AWS.APG.CARSES. CommandAddRewardLambda

    • AWS.APG.CARSES. CommandRedeemRewardLambda

    • AWS.APG.CARSES. QueryCustomerListLambda

    • AWS.APG.CARSES. QueryRewqardLambda

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.

  1. Insira os dados da solicitação ou copie um exemplo de dados de solicitação dos Dados de teste na seção Informações adicionais. Certifique-se de selecionar dados para a função que você está testando.

  2. Para executar o teste, escolha Invoke (Invocar). A resposta e quaisquer erros são exibidos na caixa de texto Resposta, e os registros são mostrados na caixa de texto Registros ou em CloudWatch Registros.

  3. Para verificar os dados, no AWS Explorer, escolha a tabela do DynamoDB (clique duas vezes).

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.

Desenvolvedor de aplicativos, DevOps engenheiro

Publique as funções restantes.

Repita as etapas anteriores para os seguintes projetos:

  • AWS.APG.CARSES. CommandDeleteLambda

  • AWS.APG.CARSES. CommandUpdateLambda

  • AWS.APG.CARSES. CommandAddRewardLambda

  • AWS.APG.CARSES. CommandRedeemRewardLambda

  • AWS.APG.CARSES. QueryCustomerListLambda

  • AWS.APG.CARSES. QueryRewqardLambda

Desenvolvedor de aplicativos, DevOps engenheiro
TarefaDescriçãoHabilidades 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.

Desenvolvedor de aplicativos

Anexe o receptor de eventos Lambda de fornecimento de eventos.

  1. Faça login no Console de Gerenciamento da AWS usando a mesma conta que você usa ao publicar os projetos Lambda.

  2. Para a região, selecione Leste dos EUA 1 ou a região em que você implantou as funções do Lambda no épico anterior.

  3. Navegue até o serviço Lambda.

  4. Selecionar a EventSourceCustomer função do Lambda

  5. Escolha Add trigger (Adicionar gatilho).

  6. Na lista suspensa Configuração do gatilho, selecione DynamoDB.

  7. Na lista suspensa da tabela do DynamoDB, selecione. cqrses-customer-cmd

  8. Na lista suspensa Iniciando a posição selecione Horizonte de corte. Horizonte de corte significa que o gatilho do DynamoDB começará a ler no último registro do fluxo (não cortado), que é o registro mais antigo no fragmento.

  9. Marque a caixa de seleção Enable trigger (Habilitar gatilho).

  10. Mantenha os padrões de valores para os campos restantes e escolha Upload (Carregar).

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-cmdda tabela do DynamoDB.

Desenvolvedor de aplicativos
TarefaDescriçãoHabilidades necessárias

Teste o fluxo e o acionador do Lambda.

  1. No Visual Studio, navegue até o AWS Explorer.

  2. Expanda o AWS Lambda e escolha a CommandRedeemRewardfunção (clique duas vezes). Na janela de função que se abre, você pode testar a função.

  3. Na caixa de texto Solicitação, insira os dados da solicitação no formato JavaScript Object Notation (JSON). Para ver um exemplo de solicitação, consulte Dados de teste na seção Informações adicionais.

  4. Escolha Invocar o .

Desenvolvedor de aplicativos

Valide usando a tabela de consulta de recompensas do DynamodDB.

  1. Abra a cqrses-reward-querymesa.

  2. Confira os pontos do cliente que resgatou a recompensa. Os pontos resgatados devem ser subtraídos do total de pontos agregados do cliente.

Desenvolvedor de aplicativos

Valide usando CloudWatch Logs.

  1. Navegue até Grupos de registros CloudWatch e escolha.

  2. O grupo de registros /aws/lambda/ contém os EventSourceReward registros do acionador. EventSourceReward Todas as chamadas do Lambda são registradas, incluindo as mensagens que você inseriu em context.Logger.LogLine e Console.Writeline no código do Lambda.

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

Referências

Vídeos

Mais informações

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.
  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.
  1. Interfaces no modelo Comando do cliente:

    • Create Customer()

    • UpdateCustomer()

    • DeleteCustomer()

    • AddPoints()

    • RedeemPoints()

  2. 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.

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 publicação e assinatura de mensagens on-premises, você pode 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.
  1. As funções de comando do Lambda realizam operações de gravação, como criar, atualizar ou excluir, no banco de dados.

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

  3. 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.

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

  5. (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 comando e consulta expandidos.

Modelo CRUD do cliente

Exemplo do código on-premises CQRS\CRUD Model\Projeto 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 do evento expandida.

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# .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

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip