

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Descomponga monolitos en microservicios mediante CQRS y abastecimiento de eventos
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

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

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

Este patrón combina dos patrones y emplea tanto el patrón de división de responsabilidad por consultas de comandos (CQRS) como el patrón de abastecimiento de eventos. El patrón CQRS divide las responsabilidades de los modelos de comando y consulta. El patrón de abastecimiento de eventos aprovecha la comunicación asincrónica basada en eventos para mejorar la experiencia general del usuario.

Puede usar servicios de CQRS y Amazon Web Services (AWS) para mantener y escalar cada modelo de datos de forma independiente y, al mismo tiempo, refactorizar su aplicación monolítica en una arquitectura de microservicios. Después, puede usar el patrón de abastecimiento de eventos para sincronizar los datos de la base de datos de comandos con la base de datos de consultas.

Este patrón emplea un código de ejemplo que incluye un archivo de solución (\*.sln) que puede abrir con la versión más reciente de Visual Studio. El ejemplo contiene el código de la API Reward para mostrar el funcionamiento de CQRS y el abastecimiento de eventos en aplicaciones de AWS sin servidor y aplicaciones tradicionales o en las instalaciones.

Para obtener más información sobre CQRS y el abastecimiento de eventos, consulte la sección de [Información adicional](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

## Requisitos previos y limitaciones
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**Requisitos previos **
+ Una cuenta de AWS activa
+ Amazon CloudWatch
+ Tablas de Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Clave de acceso y clave secreta de AWS Identity and Access Management (IAM); para obtener más información, consulte el video de la sección de *Recursos relacionados*
+ AWS Lambda
+ Familiaridad con Visual Studio
+ Familiaridad con el kit de herramientas de AWS para Visual Studio; para obtener más información, consulte el video de *demostración del Kit de herramientas de AWS para Visual Studio* en la sección de *Recursos relacionados*

**Versiones de producto**
+ [Microsoft Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/).
+ [AWS Toolkit para Visual Studio 2019](https://aws.amazon.com/visualstudio/).
+ .NET Core 3.1. Este componente es una opción de la instalación de Visual Studio. Para incluir .NET Core durante la instalación, seleccione **desarrollo multiplataforma de NET Core**.

**Limitaciones**
+ El código de ejemplo de aplicación tradicional en las instalaciones (ASP.NET Core Web API y objetos de acceso a datos) no incluye base de datos. Sin embargo, incluye el objeto en memoria `CustomerData`, que actúa como base de datos simulada. El código proporcionado es suficiente para probar el patrón.

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

**Pila de tecnología de origen**
+ Proyecto ASP.NET Core Web API
+ Servidor web IIS
+ Objeto de acceso a datos
+ Modelo CRUD

**Arquitectura de origen**

En la arquitectura de origen, el modelo CRUD contiene interfaces de comandos y consultas en una sola aplicación. Para ver un código de ejemplo, consulte `CustomerDAO.cs` (adjunto).

![Conexiones entre la aplicación, la interfaz de servicio, el modelo CRUD del cliente y la base de datos.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**Pila de tecnología de destino**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ AWS Lambda
+ (Opcional) Amazon API Gateway
+ (Opcional) Amazon Simple Notification Service (Amazon SNS)

**Arquitectura de destino**

En la arquitectura de destino, las interfaces de comando y consulta están separadas. La arquitectura que se muestra en el siguiente diagrama se puede ampliar con puerta de enlace API y Amazon SNS. Para obtener más información, consulte la sección [Información adicional](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

![Aplicación que se conecta con los microservicios de comandos del cliente y consultas del cliente sin servidor.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. Las funciones de comandos de Lambda realizan operaciones de escritura, como crear, actualizar o eliminar, en la base de datos.

1. Las funciones de consulta de Lambda realizan operaciones de lectura, como obtener o seleccionar, en la base de datos.

1. Esta función de Lambda procesa los flujos de DynamoDB de la base de datos de comandos y actualiza la base de datos de consultas con los cambios.

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

**Herramientas**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html): Amazon DynamoDB es un servicio de base de datos NoSQL totalmente administrado que ofrece un rendimiento rápido y predecible, así como una perfecta escalabilidad.
+ [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html): DynamoDB Streams captura una secuencia en orden cronológico de las modificaciones de los elementos en una tabla de DynamoDB. Este servicio posteriormente almacena esta información en un registro durante un máximo de 24 horas. El cifrado en reposo cifra los datos en DynamoDB streams.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html): AWS Lambda es un servicio de computación que permite ejecutar código sin aprovisionar ni administrar servidores. Lambda ejecuta su código solo cuando es necesario y escala de manera automática, desde unas pocas solicitudes por día hasta miles por segundo. Solo pagará por el tiempo de computación que consuma, no se aplican cargos cuando el código no se está ejecutando.
+ [La consola de administración de AWS](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html): la consola de administración de AWS es una aplicación web que engloba y hace referencia a un amplio conjunto de consolas de servicios para la administración de recursos de AWS.
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/): Visual Studio 2019 es un entorno de desarrollo integrado (IDE). La Community Edition es gratuita para colaboradores de código abierto. En este patrón usará Visual Studio 2019 Community Edition para abrir, compilar y ejecutar código de ejemplo. Solo con fines de visualización, puede usar cualquier editor de texto o [Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html).
+ [AWS Toolkit para Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html): el AWS Toolkit para Visual Studio es un complemento para el IDE de Visual Studio. El AWS Toolkit para Visual Studio facilita el desarrollo, la depuración y la implementación de aplicaciones .NET que utilizan servicios de AWS.

**Código**

Se adjunta el código de ejemplo. Para obtener más instrucciones sobre cómo implementar el código de ejemplo, consulta la sección *Epics*.

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

### Abra y cree la solución
<a name="open-and-build-the-solution"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Abra la solución. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones | 
| Cree la solución. | Abra el menú contextual (clic derecho) de la solución y elija **Compilar solución**. Esto generará y compilará todos los proyectos de la solución. La compilación debería realizarse correctamente.<br />Visual Studio Solution Explorer mostrará la estructura de directorios.[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones | 

### Cree tablas de DynamoDB
<a name="build-the-dynamodb-tables"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Proporcionar credenciales. | Si aún no tiene una clave de acceso, consulte el video de la sección de *Recursos relacionados*.[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones, ingeniero de datos, administrador de base de datos | 
| Compilar el proyecto. | Para compilar el proyecto, abra el menú contextual (clic derecho) del proyecto **AwS.APG.CQRSES.Build** y seleccione **Compilar**. | Desarrollador de aplicaciones, ingeniero de datos, administrador de base de datos | 
| Cree y rellene las tablas. | Para compilar las tablas y rellenarlas con datos iniciales, abra el menú contextual (clic derecho) del proyecto **AwS.APG.CQRSES.Build** y seleccione **Depurar**, **Iniciar nueva instancia**. | Desarrollador de aplicaciones, ingeniero de datos, administrador de base de datos | 
| Verifique la construcción de la tabla y los datos. | Para comprobarlo, acceda al **Explorador de AWS** y expanda **Amazon DynamoDB**. Se mostrarán las tablas. Abra cada tabla para mostrar los datos de ejemplo. | Desarrollador de aplicaciones, ingeniero de datos, administrador de base de datos | 

### Ejecute pruebas locales
<a name="run-local-tests"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear el proyecto CQRS. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones, ingeniero de pruebas | 
| Cree el proyecto de abastecimiento de eventos. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones, ingeniero de pruebas | 
| Ejecutar las pruebas. | Para ejecutar todas las pruebas, seleccione **Ver**, **Explorador de pruebas** y, a continuación, seleccione **Ejecutar todas las pruebas a la vista**. Todas las pruebas resultarán correctas. El sistema lo indicará con un icono de marca de verificación verde.  | Desarrollador de aplicaciones, ingeniero de pruebas | 

### Publique las funciones de Lambda de CQRS en AWS
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Publica la primera función de Lambda. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones, DevOps ingeniero | 
| Verifique la carga de la función. | (Opcional) Para comprobar que la función se ha cargado correctamente, acceda al Explorador de AWS y expanda **AWS Lambda**. Para abrir la ventana de prueba, seleccione la función de Lambda (doble clic). | Desarrollador de aplicaciones, DevOps ingeniero | 
| Pruebe la función de Lambda. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Todos los proyectos Lambda de CQRS se encuentran en las carpetas de soluciones `CQRS AWS Serverless\CQRS\Command Microservice` y ` CQRS AWS Serverless\CQRS\Command Microservice`. Para ver el directorio de soluciones y los proyectos, consulte el **Directorio de códigos fuente** en la sección de [Información adicional](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Desarrollador de aplicaciones, DevOps ingeniero | 
| Publique las funciones restantes. | Repita los pasos previos para los siguientes proyectos:[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones, DevOps ingeniero | 

### Configure la función de Lambda como oyente de eventos
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Publique los controladores de eventos Customer y Reward Lambda. | Para publicar cada controlador de eventos, siga los pasos de la épica anterior.<br />Los proyectos se encuentran en las carpetas de soluciones `CQRS AWS Serverless\Event Source\Customer Event` y `CQRS AWS Serverless\Event Source\Reward Event`. Para obtener más información, consulte *Directorio de código fuente* en la sección [Información adicional](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Desarrollador de aplicaciones | 
| Adjunte el oyente de Lambda detector de eventos. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Una vez que el oyente se haya adjuntado correctamente a la tabla de DynamoDB, se mostrará en la página del diseñador de Lambda. | Desarrollador de aplicaciones | 
| Publique y adjunte la EventSourceReward función Lambda. | Para publicar y adjuntar la función `EventSourceReward` Lambda, repita los pasos de las dos historias anteriores y selecciónela en la lista desplegable **cqrses-reward-cmd**de tablas de **DynamoDB**. | Desarrollador de aplicaciones | 

### Pruebe y valide los flujos de DynamoDB y el desencadenante de Lambda
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Pruebe la transmisión y el desencadenante de Lambda. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones | 
| Valide usando la tabla de consultas de recompensas de DynamodDB. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones | 
| Valide mediante CloudWatch registros. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Desarrollador de aplicaciones | 
| Valide el EventSourceCustomer disparador. | Para validar el `EventSourceCustomer` disparador, repite los pasos de esta epopeya utilizando la tabla de clientes y los CloudWatch registros respectivos del `EventSourceCustomer` disparador. | Desarrollador de aplicaciones | 

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

**Referencias**
+ [Descargas de Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/)
+ [Descargar AWS Toolkit para Visual Studio](https://aws.amazon.com/visualstudio/)
+ [Guía del usuario de AWS Toolkit para Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [Sin servidor en AWS](https://aws.amazon.com/serverless/)
+ [Casos de uso y patrones de diseño de DynamoDB](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [CQRS Martin Fowler](https://martinfowler.com/bliki/CQRS.html)
+ [Aprovisionamiento de eventos Martin Fowler](https://martinfowler.com/eaaDev/EventSourcing.html)

**Videos**
+ [Demo de AWS Toolkit para Visual Studio](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [¿Cómo creo una ID de clave de acceso para un nuevo usuario de IAM?](https://www.youtube.com/watch?v=665RYobRJDY)

## Información adicional
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**CQRS y abastecimiento de eventos**

*CQRS*

El patrón CQRS separa un único modelo de operaciones conceptual, como un modelo CRUD (creación, lectura, actualización, eliminación) único de objetos de acceso a datos, en modelos de operaciones de comando y consulta. El modelo de comandos hace referencia a cualquier operación, como crear, actualizar o eliminar, que cambia el estado. El modelo de consulta hace referencia a cualquier operación que devuelva un valor.

![Arquitectura con interfaz de servicio, modelo CRUD y base de datos.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. El modelo CRUD del cliente incluye las siguientes interfaces:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`

Cuando sus necesidades sean más complejas, podrá superar este enfoque de modelo único. El CQRS emplea un modelo de comandos y un modelo de consulta para separar las responsabilidades de escribir y leer los datos. De esta forma, los datos se pueden mantener y gestionar de forma independiente. Con una clara separación de responsabilidades, las mejoras de cada modelo no afectan al otro. Esta separación mejora el mantenimiento y el rendimiento, y reduce la complejidad de la aplicación a medida que crece.

![La aplicación se divide en modelos de comandos y consultas, y comparte una única base de datos.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. Interfaces en el modelo de comandos del cliente:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. Interfaces en el modelo de consultas del cliente:
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`
   + `GetMonthlyStatement()`

Para ver código de ejemplo, consulte el *Directorio de códigos fuente*.

A continuación, el patrón CQRS desacopla la base de datos. Esta disociación posibilita la independencia total de cada servicio, que es el ingrediente principal de la arquitectura de microservicios.

![Bases de datos independientes para los modelos de comandos y consultas.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 Al usar CQRS en la nube de AWS, puede optimizar aún más cada servicio. Por ejemplo, puede establecer diferentes configuraciones informáticas, o elegir entre un microservicio sin servidor o uno basado en contenedores. Puedes sustituir el almacenamiento en caché local por Amazon. ElastiCache Si tiene una publish/subscribe mensajería local, puede sustituirla por Amazon Simple Notification Service (Amazon SNS). Además, puede aprovechar los pay-as-you-go precios y la amplia gama de servicios de AWS, que solo paga por lo que utiliza.

CQRS ofrece los siguientes beneficios:
+ Escalado independiente: la estrategia de escalado de cada modelo se puede adaptar para satisfacer los requisitos y la demanda del servicio. Al igual que en las aplicaciones de alto rendimiento, separar la lectura y la escritura permite escalar el modelo de forma independiente para satisfacer cada demanda. También puede agregar o reducir recursos de cómputo para satisfacer la demanda de escalabilidad de un modelo sin afectar al otro.
+ Mantenimiento independiente: la separación de los modelos de consulta y comando mejora la capacidad de mantenimiento de los modelos. Puede realizar cambios en el código y mejoras en un modelo sin que ello afecte al otro.
+ Seguridad: es más fácil aplicar los permisos y las políticas a modelos separados para lectura y escritura.
+ Lecturas optimizadas: puede definir un esquema optimizado para las consultas. Por ejemplo, puede definir un esquema para datos agregados y un esquema independiente para tablas de hechos.
+ Integración: CQRS se adapta bien a los modelos de programación basados en eventos.
+ Complejidad gestionada: la separación en modelos de consulta y comando es adecuada para dominios complejos.

Al utilizar CQRS, tenga en cuenta lo siguiente:
+ El patrón de CQRS se aplica solo a una parte específica de una aplicación, y no a su conjunto. La implementación en un dominio inadecuado para el patrón puede reducir la productividad, aumentar el riesgo e introducir complejidad.
+ El patrón funciona mejor en modelos de uso frecuente que presentan un desequilibrio en las operaciones de lectura y escritura.
+ En el caso de aplicaciones de lectura intensiva, como informes de gran tamaño que tardan en procesarse, CQRS le ofrece la opción de seleccionar la base de datos adecuada y crear un esquema para almacenar los datos agregados. Esto mejora el tiempo de respuesta en la lectura y visualización del informe, ya que procesa los datos del informe solo una vez y los coloca en la tabla agregada.
+ En el caso de las aplicaciones de escritura intensiva, puede configurar la base de datos para operaciones de escritura y permitir que el microservicio de comandos se escale de forma independiente cuando aumente la demanda de escritura. Para ver ejemplos, consulte los microservicios `AWS.APG.CQRSES.CommandRedeemRewardLambda` y `AWS.APG.CQRSES.CommandAddRewardLambda`.

*Aprovisionamiento de eventos*

El siguiente paso consiste en usar el abastecimiento de eventos para sincronizar la base de datos de consultas cuando se ejecuta un comando. Por ejemplo, considere los siguientes eventos:
+ Al añadir un punto de recompensa, es necesario actualizar sus puntos de recompensa totales o agregados en la base de datos de consultas.
+ El apellido del cliente se actualiza en la base de datos de comandos, y es necesario actualizar la información del cliente en la base de datos de consultas.

En un modelo CRUD tradicional, se garantiza la coherencia de los datos al bloquearlos hasta que finalice la transacción. En el abastecimiento de eventos, los datos se sincronizan publicando una serie de eventos que el suscriptor utilizará para actualizar sus datos respectivos.

El patrón de abastecimiento de eventos garantiza y registra una serie completa de acciones realizadas con los datos, y las publica a través de una secuencia de eventos. Estos eventos representan un conjunto de cambios en los datos que los suscriptores de ese evento deben procesar para mantener su registro actualizado. El suscriptor consume estos eventos y sincroniza los datos en la base de datos del suscriptor. En este caso, es la base de datos de consultas.

El siguiente diagrama muestra el abastecimiento de eventos con CQRS en AWS.

![Arquitectura de microservicios para CQRS y patrones de abastecimiento de eventos mediante servicios sin servidor de AWS.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. Las funciones de comandos de Lambda realizan operaciones de escritura, como crear, actualizar o eliminar, en la base de datos.

1. Las funciones de consulta de Lambda realizan operaciones de lectura, como obtener o seleccionar, en la base de datos.

1. Esta función de Lambda procesa los flujos de DynamoDB de la base de datos de comandos y actualiza la base de datos de consultas con los cambios. También puede usar esta función para publicar un mensaje en Amazon SNS y que los suscriptores puedan procesar los datos.

1. (Opcional) El suscriptor del evento de Lambda procesa el mensaje publicado por Amazon SNS y actualiza la base de datos de consultas.

1. (Opcional) Amazon SNS envía una notificación por correo electrónico de la operación de escritura.

En AWS, DynamoDB Streams puede sincronizar la base de datos de consultas. DynamoDB captura una secuencia en orden cronológico de las modificaciones de los elementos en la tabla de DynamoDB en tiempo casi real y almacena la información de forma duradera en un plazo máximo de 24 horas.

La activación de DynamoDB Streams permite a la base de datos publicar una secuencia de eventos que posibilita el patrón de abastecimiento de eventos. El patrón de abastecimiento de eventos añade al suscriptor del evento. La aplicación del suscriptor del evento consume el evento y lo procesa en función de la responsabilidad del suscriptor. En el diagrama anterior, el suscriptor del evento envía los cambios a la base de datos de Query DynamoDB para mantener los datos sincronizados. El uso de Amazon SNS, el agente de mensajes y la aplicación de suscripción de eventos mantiene la arquitectura desacoplada.

El abastecimiento de eventos ofrece los siguientes beneficios:
+ Coherencia de los datos transaccionales
+ Un registro de auditoría fiable y un historial de las acciones que permite supervisar las medidas adoptadas en los datos
+ Las aplicaciones distribuidas, como los microservicios, pueden sincronizar sus datos en todo el entorno
+ Publicación fiable de los eventos siempre que cambie el estado
+ Reconstrucción o reproducción de estados anteriores
+ Entidades con acoplamiento flexible que intercambian eventos para migrar de una aplicación monolítica a microservicios
+ Reducción de los conflictos causados por actualizaciones simultáneas; el abastecimiento de eventos evita la necesidad de actualizar los objetos directamente en el almacén de datos
+ Flexibilidad y extensibilidad, ya que la tarea se desvincula del evento
+ Actualizaciones externas del sistema
+ Gestión de múltiples tareas en un solo evento

Cuando use abastecimiento de eventos, tenga en cuenta los siguientes puntos:
+ Como existe cierto retardo en la actualización de los datos entre las bases de datos de suscriptor de origen, la única forma de deshacer un cambio es añadir un evento de compensación al almacén de eventos.
+ La implementación del abastecimiento de eventos tiene cierta curva de aprendizaje, ya que su estilo de programación es diferente.

**Datos de prueba**

Use los siguientes datos de prueba para probar la función de Lambda tras una implementación correcta.

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

Introduzca la ID del cliente como dato de solicitud. Por ejemplo, si la ID de cliente es 151, introduzca 151 como dato de solicitud.

```
151
```

**QueryCustomerList**

Está en blanco. Cuando se invoca, devuelve a todos los clientes.

**CommandAddReward**

Añade 40 puntos al cliente con la ID 1 (Richard).

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

**CommandRedeemReward**

Esto reducirá 15 puntos al cliente con la ID 1 (Richard).

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

**QueryReward**

Introduzca la ID del cliente. Por ejemplo, introduzca 1 para Richard, 2 para Arnav y 3 para Shirley.

```
2 
```

**Directorio de códigos fuente**

Use la siguiente tabla como guía de estructura de directorios de la solución de Visual Studio. 

*Ejemplo de código de muestra de directorio CQRS en las instalaciones*

![Se ha ampliado el directorio de soluciones con los servicios de comando y consulta.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**Modelo CRUD de cliente**

Proyecto CQRS On-Premises Code Sample\\CRUD Model\\AWS.APG.CQRSES.DAL

**Versión CQRS del modelo CRUD del cliente**
+ Comando del cliente: proyecto `CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command`
+ Consulta del cliente: proyecto `CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query`

**Microservicios de comando y consulta**

El microservicio de comandos se encuentra en la carpeta de soluciones `CQRS On-Premises Code Sample\CQRS Model\Command Microservice`:
+ El proyecto de API ASP.NET Core `AWS.APG.CQRSES.CommandMicroservice` actúa como punto de entrada desde el que los consumidores interactúan con el servicio.
+ El proyecto .NET Core `AWS.APG.CQRSES.Command` es un objeto que aloja objetos e interfaces relacionados con comandos.

El microservicio de consultas se encuentra en la carpeta de soluciones `CQRS On-Premises Code Sample\CQRS Model\Query Microservice`:
+ El proyecto de API ASP.NET Core `AWS.APG.CQRSES.QueryMicroservice` actúa como punto de entrada desde el que los consumidores interactúan con el servicio.
+ El proyecto .NET Core `AWS.APG.CQRSES.Query` es un objeto que aloja objetos e interfaces relacionados con consultas.

*Directorio de soluciones de código CQRS AWS sin servidor*

![Directorio de soluciones que muestra tanto los microservicios como el origen de eventos ampliado.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

Este código es la versión de AWS del código en las instalaciones que emplea los servicios sin servidor de AWS.

En C\# .NET Core, cada función de Lambda está representada por un proyecto .NET Core. En el código de ejemplo de este patrón, hay un proyecto independiente para cada interfaz en los modelos de comandos y consultas.

**Uso de los servicios de AWS por CQRS**

Puede encontrar el directorio raíz de soluciones para CQRS con servicios sin servidor de AWS en la carpeta `CQRS AWS Serverless\CQRS`. El ejemplo incluye dos modelos: Customer y Reward.

El comando de funciones de Lambda para Customer y Reward se encuentra en las carpetas `CQRS\Command Microservice\Customer` y `CQRS\Command Microservice\Reward`. Contienen los siguientes proyectos de Lambda:
+ Comando Customer: `CommandCreateLambda`, `CommandDeleteLambda` y `CommandUpdateLambda`
+ Comando Reward: `CommandAddRewardLambda` y `CommandRedeemRewardLambda`

Las funciones de Lambda de consulta para Customer y Reward se encuentra en las carpetas `CQRS\Query Microservice\Customer` y `CQRS\QueryMicroservice\Reward`. Contienen los proyectos de Lambda `QueryCustomerListLambda` and `QueryRewardLambda`.

**Proyecto de prueba de CQRS**

El proyecto de prueba se encuentra en la carpeta `CQRS\Tests`. Este proyecto contiene un script de prueba para automatizar las pruebas de las funciones de Lambda de CQRS.

**Abastecimiento de eventos mediante servicios de AWS**

Las transmisiones de DynamoDB Customer y Reward inician los siguientes controladores de eventos de Lambda para procesar y sincronizar los datos de las tablas de consultas.
+ La función de Lambda `EventSourceCustomer` se asigna al flujo de DynamoDB de la tabla Customer (`cqrses-customer-cmd`).
+ La función de Lambda `EventSourceReward` se asigna al flujo de DynamoDB de la tabla Customer (`cqrses-reward-cmd`).

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

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: [attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)