Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Scomponi i monoliti in microservizi utilizzando e generando eventi CQRS
Creato da Rodolfo Jr. Cerrada (AWS), Dmitry Gulin (), e Tabby Ward () AWS AWS
Ambiente: PoC o pilota | Fonte: modello Monolith CRUD | Obiettivo: microservizi |
Tipo R: Re-architect | Carico di lavoro: open source | Tecnologie: modernizzazione; messaggistica e comunicazioni; serverless |
AWSservizi: Amazon DynamoDB; LambdaAWS; Amazon SNS |
Riepilogo
Questo modello combina due modelli, utilizzando sia il pattern command query responsibility separation (CQRS) sia il pattern di origine degli eventi. Il CQRS modello separa le responsabilità dei modelli di comando e di interrogazione. Il pattern di approvvigionamento degli eventi sfrutta la comunicazione asincrona basata sugli eventi per migliorare l'esperienza utente complessiva.
Puoi utilizzare i servizi Amazon Web Services (AWS) per mantenere CQRS e scalare ogni modello di dati in modo indipendente, rifattorizzando al contempo la tua applicazione monolitica in un'architettura di microservizi. Quindi puoi utilizzare il pattern di sourcing degli eventi per sincronizzare i dati dal database dei comandi al database delle query.
Questo modello utilizza un codice di esempio che include un file di soluzione (*.sln) che è possibile aprire utilizzando l'ultima versione di Visual Studio. L'esempio contiene API codice Reward per mostrare come CQRS funziona il sourcing degli eventi nelle applicazioni AWS serverless, tradizionali o locali.
Prerequisiti e limitazioni
Prerequisiti
Un account attivo AWS
Amazon CloudWatch
Tabelle Amazon DynamoDB
Amazon DynamoDB Streams
AWSChiave di accesso e chiave segreta di Identity and Access Management (IAM); per ulteriori informazioni, guarda il video nella sezione Risorse correlate
AWSLambda
Familiarità con Visual Studio
Familiarità con AWS Toolkit for Visual Studio; per ulteriori informazioni, guarda AWSil video dimostrativo di Toolkit for Visual Studio nella sezione Risorse correlate
Versioni del prodotto
. NETNucleo 3.1. Questo componente è un'opzione nell'installazione di Visual Studio. Da includere. NETCore durante l'installazione, seleziona NETCore multipiattaforma development.
Limitazioni
Il codice di esempio per un'applicazione locale tradizionale (. ASP NETCore Web API and Data Access Objects) non viene fornito con un database. Tuttavia, viene fornito con l'oggetto
CustomerData
in memoria, che funge da database fittizio. Il codice fornito è sufficiente per testare il modello.
Architettura
Stack di tecnologia di origine
ASP. NETAPIProgetto Core Web
IISServer Web
Oggetto di accesso ai dati
CRUDmodello
Architettura di origine
Nell'architettura di origine, il CRUD modello contiene interfacce di comando e di interrogazione in un'unica applicazione. Per un esempio di codice, vedere CustomerDAO.cs
(allegato).
Stack tecnologico Target
Amazon DynamoDB
Amazon DynamoDB Streams
AWSLambda
(Opzionale) Amazon API Gateway
(Opzionale) Amazon Simple Notification Service (AmazonSNS)
Architettura Target
Nell'architettura di destinazione, le interfacce di comando e di interrogazione sono separate. L'architettura mostrata nel diagramma seguente può essere estesa con API Gateway e AmazonSNS. Per ulteriori informazioni, consulta la sezione Informazioni aggiuntive.
Le funzioni Command Lambda eseguono operazioni di scrittura, come creare, aggiornare o eliminare, sul database.
Le funzioni Query Lambda eseguono operazioni di lettura, come get o select, sul database.
Questa funzione Lambda elabora i flussi DynamoDB dal database Command e aggiorna il database Query per le modifiche.
Strumenti
Strumenti
Amazon DynamoDB: Amazon DynamoDB è un servizio SQL No database completamente gestito che offre prestazioni veloci e prevedibili con una scalabilità perfetta.
Amazon DynamoDB Streams — DynamoDB Streams acquisisce una sequenza ordinata nel tempo di modifiche a livello di elemento in qualsiasi tabella DynamoDB. Quindi memorizza queste informazioni in un registro per un massimo di 24 ore. La crittografia a riposo crittografa i dati in DynamoDB Streams.
AWSLambda: AWS Lambda è un servizio di elaborazione che supporta l'esecuzione di codice senza effettuare il provisioning o la gestione di server. Lambda esegue il codice solo quando è necessario e si dimensiona automaticamente, da poche richieste al giorno a migliaia al secondo. Verrà addebitato soltanto il tempo di calcolo consumato e non verrà addebitato alcun costo quando il codice non è in esecuzione.
AWSConsole di gestione: la console di AWS gestione è un'applicazione Web che comprende un'ampia raccolta di console di servizio per la gestione dei servizi. AWS
Visual Studio 2019 Community Edition
— Visual Studio 2019 è un ambiente di sviluppo integrato (IDE). La Community Edition è gratuita per i contributori open source. In questo modello, utilizzerai Visual Studio 2019 Community Edition per aprire, compilare ed eseguire codice di esempio. Solo per la visualizzazione, puoi utilizzare qualsiasi editor di testo o Visual Studio Code. AWSToolkit for Visual Studio — AWS Il Toolkit for Visual Studio è un plugin per Visual Studio. IDE AWSToolkit for Visual Studio semplifica lo sviluppo, il debug e la distribuzione. NETapplicazioni che utilizzano servizi. AWS
Codice
Il codice di esempio è allegato. Per istruzioni sulla distribuzione del codice di esempio, consulta la sezione Epics.
Epiche
Attività | Descrizione | Competenze richieste |
---|---|---|
Aprire la soluzione. |
| Sviluppatore di app |
Crea la soluzione. | Apri il menu contestuale (fai clic con il pulsante destro del mouse) per la soluzione, quindi scegli Crea soluzione. Questo creerà e compilerà tutti i progetti della soluzione. Dovrebbe essere compilato correttamente. Visual Studio Solution Explorer dovrebbe mostrare la struttura delle cartelle.
| Sviluppatore di app |
Attività | Descrizione | Competenze richieste |
---|---|---|
Fornire le credenziali. | Se non disponi ancora di una chiave di accesso, guarda il video nella sezione Risorse correlate.
| Sviluppatore di app, ingegnere dei dati, DBA |
Compilare il progetto. | Per creare il progetto, apri il menu contestuale (fai clic con il pulsante destro del mouse) per AWS. APG. CQRSES.Costruisci progetto, quindi scegli Costruisci. | Sviluppatore di app, ingegnere dei dati, DBA |
Crea e popola le tabelle. | Per creare le tabelle e popolarle con i dati iniziali, apri il menu contestuale (fai clic con il pulsante destro del mouse) per AWS. APG. CQRSES.Build project, quindi scegli Debug, Start New Instance. | Sviluppatore di app, ingegnere dei dati, DBA |
Verifica la struttura della tabella e i dati. | Per verificare, accedi a AWSExplorer ed espandi Amazon DynamoDB. Dovrebbe visualizzare le tabelle. Apri ogni tabella per visualizzare i dati di esempio. | Sviluppatore di app, ingegnere dei dati, DBA |
Attività | Descrizione | Competenze richieste |
---|---|---|
Compilare il progetto CQRS. |
| Sviluppatore di app, tecnico di test |
Crea il progetto di event-sourcing. |
| Sviluppatore di app, tecnico di test |
Esegui i test. | Per eseguire tutti i test, scegli Visualizza, Test Explorer, quindi scegli Esegui tutti i test in visualizzazione. Tutti i test devono essere superati, come indicato da un'icona verde con un segno di spunta. | Sviluppatore di app, tecnico di test |
Attività | Descrizione | Competenze richieste |
---|---|---|
Pubblica la prima funzione Lambda. |
| Sviluppatore di app, DevOps ingegnere |
Verifica il caricamento della funzione. | (Facoltativo) È possibile verificare che la funzione sia stata caricata correttamente accedendo a AWS Explorer ed espandendo AWSLambda. Per aprire la finestra di test, scegliete la funzione Lambda (doppio clic). | Sviluppatore di app, ingegnere DevOps |
Prova la funzione Lambda. |
Tutti i progetti CQRS Lambda si trovano nelle cartelle | Sviluppatore di app, DevOps ingegnere |
Pubblica le funzioni rimanenti. | Ripetete i passaggi precedenti per i seguenti progetti:
| Sviluppatore di app, DevOps ingegnere |
Attività | Descrizione | Competenze richieste |
---|---|---|
Pubblica i gestori di eventi Customer and Reward Lambda. | Per pubblicare ogni gestore di eventi, segui i passaggi dell'epopea precedente. I progetti si trovano nelle cartelle | Sviluppatore di app |
Collega il listener di eventi Lambda event-sourcing. |
Dopo che il listener è stato collegato correttamente alla tabella DynamoDB, verrà visualizzato nella pagina di progettazione Lambda. | Sviluppatore di app |
Pubblica e allega la funzione EventSourceReward Lambda. | Per pubblicare e allegare la funzione | Sviluppatore di app |
Attività | Descrizione | Competenze richieste |
---|---|---|
Prova lo stream e il trigger Lambda. |
| Sviluppatore di app |
Convalida utilizzando la tabella delle query di ricompensa di DynamodDB. |
| Sviluppatore di app |
Convalida, utilizzando i registri. CloudWatch |
| Sviluppatore di app |
Convalida il trigger. EventSourceCustomer | Per convalidare il | Sviluppatore di app |
Risorse correlate
Riferimenti
Video
Informazioni aggiuntive
CQRSe approvvigionamento di eventi
CQRS
Il CQRS modello separa un singolo modello di operazioni concettuali, ad esempio un singolo modello di oggetto di accesso ai dati CRUD (creazione, lettura, aggiornamento, eliminazione), in modelli di operazioni di comando e interrogazione. Il modello di comando si riferisce a qualsiasi operazione, come la creazione, l'aggiornamento o l'eliminazione, che modifica lo stato. Il modello di interrogazione si riferisce a qualsiasi operazione che restituisce un valore.
Il CRUD modello Customer include le seguenti interfacce:
Create Customer()
UpdateCustomer()
DeleteCustomer()
AddPoints()
RedeemPoints()
GetVIPCustomers()
GetCustomerList()
GetCustomerPoints()
Man mano che i requisiti diventano più complessi, puoi passare da questo approccio a modello singolo. CQRSutilizza un modello di comandi e un modello di interrogazione per separare la responsabilità di scrittura e lettura dei dati. In questo modo, i dati possono essere mantenuti e gestiti in modo indipendente. Con una chiara separazione delle responsabilità, i miglioramenti apportati a ciascun modello non influiscono sull'altro. Questa separazione migliora la manutenzione e le prestazioni e riduce la complessità dell'applicazione man mano che cresce.
Interfacce nel modello Customer Command:
Create Customer()
UpdateCustomer()
DeleteCustomer()
AddPoints()
RedeemPoints()
Interfacce nel modello Customer Query:
GetVIPCustomers()
GetCustomerList()
GetCustomerPoints()
GetMonthlyStatement()
Per un esempio di codice, vedi Directory del codice sorgente.
Il CQRS pattern quindi disaccoppia il database. Questo disaccoppiamento porta alla totale indipendenza di ogni servizio, che è l'ingrediente principale dell'architettura dei microservizi.
Utilizzando CQRS in the AWS Cloud, puoi ottimizzare ulteriormente ogni servizio. Ad esempio, puoi impostare diverse impostazioni di elaborazione o scegliere tra un microservizio serverless o basato su container. Puoi sostituire la memorizzazione nella cache locale con Amazon. ElastiCache Se disponi di un messaggio di pubblicazione/sottoscrizione locale, puoi sostituirlo con Amazon Simple Notification Service (Amazon). SNS Inoltre, puoi usufruire dei prezzi pay-as-you -go e dell'ampia gamma di AWS servizi che paghi solo per ciò che usi.
CQRSinclude i seguenti vantaggi:
Scalabilità indipendente: ogni modello può avere la propria strategia di scalabilità adattata per soddisfare i requisiti e la domanda del servizio. Analogamente alle applicazioni ad alte prestazioni, la separazione di lettura e scrittura consente al modello di scalare in modo indipendente per soddisfare ogni esigenza. È inoltre possibile aggiungere o ridurre le risorse di elaborazione per soddisfare la richiesta di scalabilità di un modello senza influire sull'altro.
Manutenzione indipendente: la separazione dei modelli di query e comando migliora la manutenibilità dei modelli. È possibile apportare modifiche e miglioramenti al codice di un modello senza influire sull'altro.
Sicurezza: è più semplice applicare le autorizzazioni e le politiche a modelli separati per la lettura e la scrittura.
Letture ottimizzate: è possibile definire uno schema ottimizzato per le query. Ad esempio, è possibile definire uno schema per i dati aggregati e uno schema separato per le tabelle dei fatti.
Integrazione: CQRS si adatta bene ai modelli di programmazione basati su eventi.
Complessità gestita: la separazione in modelli di query e comandi è adatta a domini complessi.
Durante l'utilizzoCQRS, tieni presente le seguenti avvertenze:
Il CQRS modello si applica solo a una parte specifica di un'applicazione e non all'intera applicazione. Se implementato in un dominio che non corrisponde al modello, può ridurre la produttività, aumentare i rischi e introdurre complessità.
Il pattern funziona meglio per i modelli utilizzati di frequente che presentano uno squilibrio nelle operazioni di lettura e scrittura.
Per le applicazioni che richiedono molta lettura, come i report di grandi dimensioni che richiedono tempo per l'elaborazione, CQRS offre la possibilità di selezionare il database giusto e creare uno schema per archiviare i dati aggregati. Ciò migliora il tempo di risposta di lettura e visualizzazione del report elaborando i dati del report una sola volta e scaricandoli nella tabella aggregata.
Per le applicazioni che richiedono molta scrittura, è possibile configurare il database per le operazioni di scrittura e consentire al comando microservice di scalare in modo indipendente quando la richiesta di scrittura aumenta. Per esempi, consulta and microservices.
AWS.APG.CQRSES.CommandRedeemRewardLambda
AWS.APG.CQRSES.CommandAddRewardLambda
Approvvigionamento di eventi
Il passaggio successivo consiste nell'utilizzare l'origine degli eventi per sincronizzare il database delle query quando viene eseguito un comando. Ad esempio, considerate i seguenti eventi:
Viene aggiunto un punto premio cliente che richiede l'aggiornamento dei punti premio totali o aggregati del cliente nel database delle query.
Il cognome di un cliente viene aggiornato nel database dei comandi, il che richiede l'aggiornamento delle informazioni sostitutive sul cliente nel database delle query.
Nel CRUD modello tradizionale, si garantisce la coerenza dei dati bloccandoli fino al termine di una transazione. Nell'event sourcing, i dati vengono sincronizzati mediante la pubblicazione di una serie di eventi che verranno utilizzati da un abbonato per aggiornare i rispettivi dati.
Il modello di sourcing degli eventi garantisce e registra una serie completa di azioni intraprese sui dati e le pubblica attraverso una sequenza di eventi. Questi eventi rappresentano un insieme di modifiche ai dati che i sottoscrittori di quell'evento devono elaborare per mantenere aggiornato il proprio record. Questi eventi vengono utilizzati dal sottoscrittore, sincronizzando i dati nel database del sottoscrittore. In questo caso, si tratta del database delle interrogazioni.
Il diagramma seguente mostra l'origine degli eventi utilizzata con CQRS on. AWS
Le funzioni Command Lambda eseguono operazioni di scrittura, come creare, aggiornare o eliminare, sul database.
Le funzioni Query Lambda eseguono operazioni di lettura, come get o select, sul database.
Questa funzione Lambda elabora i flussi DynamoDB dal database Command e aggiorna il database Query per le modifiche. Puoi utilizzare questa funzione anche per pubblicare un messaggio su Amazon in SNS modo che i suoi abbonati possano elaborare i dati.
(Facoltativo) Il sottoscrittore dell'evento Lambda elabora il messaggio pubblicato da Amazon SNS e aggiorna il database Query.
(Facoltativo) Amazon SNS invia una notifica via e-mail dell'operazione di scrittura.
AttivoAWS, il database delle query può essere sincronizzato tramite DynamoDB Streams. DynamoDB acquisisce una sequenza ordinata nel tempo di modifiche a livello di elemento in una tabella DynamoDB quasi in tempo reale e archivia le informazioni in modo duraturo entro 24 ore.
L'attivazione di DynamoDB Streams consente al database di pubblicare una sequenza di eventi che rende possibile lo schema di sourcing degli eventi. Il pattern di origine degli eventi aggiunge il sottoscrittore dell'evento. L'applicazione Event Subscriber utilizza l'evento e lo elabora in base alla responsabilità del sottoscrittore. Nel diagramma precedente, il sottoscrittore dell'evento invia le modifiche al database Query DynamoDB per mantenere i dati sincronizzati. L'uso di AmazonSNS, del broker di messaggi e dell'applicazione per abbonati agli eventi mantiene l'architettura disaccoppiata.
L'approvvigionamento di eventi include i seguenti vantaggi:
Coerenza per i dati transazionali
Una pista di controllo e una cronologia delle azioni affidabili, che possono essere utilizzate per monitorare le azioni intraprese nei dati
Consente alle applicazioni distribuite come i microservizi di sincronizzare i dati in tutto l'ambiente
Pubblicazione affidabile degli eventi ogni volta che lo stato cambia
Ricostruzione o riproduzione degli stati passati
Entità liberamente accoppiate che scambiano eventi per la migrazione da un'applicazione monolitica ai microservizi
Riduzione dei conflitti causati dagli aggiornamenti simultanei; l'event sourcing evita la necessità di aggiornare gli oggetti direttamente nell'archivio dati
Flessibilità ed estensibilità grazie al disaccoppiamento tra attività ed evento
Aggiornamenti di sistema esterni
Gestione di più attività in un unico evento
Quando utilizzi il sourcing degli eventi, tieni presente le seguenti avvertenze:
Poiché si verifica un certo ritardo nell'aggiornamento dei dati tra i database degli abbonati di origine, l'unico modo per annullare una modifica consiste nell'aggiungere un evento di compensazione all'archivio eventi.
L'implementazione dell'event sourcing presenta una curva di apprendimento a causa del suo diverso stile di programmazione.
Dati di test
Utilizza i seguenti dati di test per testare la funzione Lambda dopo una corretta implementazione.
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
Inserisci l'ID cliente come dati della richiesta. Ad esempio, se l'ID cliente è 151, inserisci 151 come dati della richiesta.
151
QueryCustomerList
Questo campo è vuoto. Quando viene richiamato, restituirà tutti i clienti.
CommandAddReward
Ciò aggiungerà 40 punti al cliente con ID 1 (Richard).
{ "Id":10101, "CustomerId":1, "Points":40 }
CommandRedeemReward
In questo modo verranno detratti 15 punti dal cliente con ID 1 (Richard).
{ "Id":10110, "CustomerId":1, "Points":15 }
QueryReward
Inserisci l'ID del cliente. Ad esempio, inserisci 1 per Richard, 2 per Arnav e 3 per Shirley.
2
Directory del codice sorgente
Usa la tabella seguente come guida alla struttura di directory della soluzione Visual Studio.
CQRSDirectory della soluzione di esempio di codice locale
CRUDModello di cliente
CQRSEsempio di codice locale\ CRUD Model\AWS. APG. CQRSES. DALprogetto
CQRSversione del CRUD modello Customer
Comando cliente:
CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command
progettoRichiesta del cliente:
CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query
progetto
Microservizi Command and Query
Il microservizio Command si trova nella cartella della soluzione: CQRS On-Premises Code Sample\CQRS Model\Command Microservice
AWS.APG.CQRSES.CommandMicroservice
ASP. NETAPIIl progetto principale funge da punto di ingresso in cui i consumatori interagiscono con il servizio.AWS.APG.CQRSES.Command
. NETIl progetto principale è un oggetto che ospita oggetti e interfacce relativi ai comandi.
Il microservizio di interrogazione si trova nella cartella della soluzione: CQRS On-Premises Code Sample\CQRS Model\Query Microservice
AWS.APG.CQRSES.QueryMicroservice
ASP. NETAPIIl progetto principale funge da punto di ingresso in cui i consumatori interagiscono con il servizio.AWS.APG.CQRSES.Query
. NETIl progetto principale è un oggetto che ospita oggetti e interfacce relativi alle query.
CQRSAWSDirectory di soluzioni di codice serverless
Questo codice è la AWS versione del codice locale che utilizza servizi AWS serverless.
In C#. NETCore, ogni funzione Lambda è rappresentata da una. NETProgetto principale. Nel codice di esempio di questo modello, esiste un progetto separato per ogni interfaccia nei modelli di comando e query.
CQRSutilizzo AWS dei servizi
È possibile trovare la directory della soluzione principale per CQRS l'utilizzo dei servizi AWS serverless nella CQRS AWS Serverless\CQRS
cartella. L'esempio include due modelli: Customer e Reward.
Le funzioni di comando Lambda per Customer e Reward si trovano nelle cartelle CQRS\Command Microservice\Customer
eCQRS\Command Microservice\Reward
. Contengono i seguenti progetti Lambda:
Comando cliente:
CommandCreateLambda
CommandDeleteLambda
, eCommandUpdateLambda
Comando di ricompensa:
CommandAddRewardLambda
eCommandRedeemRewardLambda
Le funzioni di interrogazione Lambda per Customer e Reward si trovano nelle cartelle CQRS\Query Microservice\Customer
andCQRS\QueryMicroservice\Reward
. Contengono i progetti QueryCustomerListLambda
e QueryRewardLambda
Lambda.
CQRSprogetto di test
Il progetto di test si trova nella CQRS\Tests
cartella. Questo progetto contiene uno script di test per automatizzare il test delle funzioni CQRS Lambda.
Approvvigionamento di eventi tramite servizi AWS
I seguenti gestori di eventi Lambda vengono avviati dai flussi DynamoDB Customer e Reward per elaborare e sincronizzare i dati nelle tabelle di query.
La funzione
EventSourceCustomer
Lambda è mappata sul flussocqrses-customer-cmd
DynamoDB della tabella Customer ().La funzione
EventSourceReward
Lambda è mappata sul flussocqrses-reward-cmd
DynamoDB della tabella Reward ().