trabajo flujos envio ejemplos correos email design-patterns domain-driven-design cqrs

email - flujos - Envío de un correo electrónico o SMS utilizando CQRS y diseño controlado por dominio



ejemplos flujos de trabajo sharepoint 2013 (2)

Creo que un objeto de dominio para el mensaje SMS no es necesario. Solo necesita reportar los SMS enviados al cliente, ¿correcto? Los mensajes SMS no se utilizan en ninguna lógica de dominio, ¿correcto?

Por lo tanto, me gustaría que el controlador envíe un SMS y luego publique otro evento que diga que se envió un SMS y que un controlador de eventos escuche el mensaje SMS enviado y materialice esa información en un modelo de lectura para que el cliente pueda verlos.

En este momento estamos construyendo una nueva arquitectura que se basa en los principios de CQRS y el diseño impulsado por el dominio. Ahora estamos teniendo algunas discusiones sobre cómo debemos tratar con la comunicación externa. Para hacer la pregunta más concreta, utilizo el ejemplo de enviar una notificación por SMS cuando un cliente crea un pedido.

El cliente crea un NewOrderCommand que se maneja con el controlador de comandos asociado. El controlador crea un nuevo objeto Order en el modelo de dominio, que genera un NewcustomerCreatedEvent. El objeto se guarda en el almacén de eventos y el evento se publica para todos los oyentes.

Hasta ahora todo bien pero ahora la pregunta. ¿Dónde debemos enviar la notificación por SMS?

Nuestro primer instinto nos dijo que deberíamos enviarlo utilizando un detector de eventos que escuche NewCustomerCreatedEvent y envíe el mensaje. El problema con este enfoque es que el envío de SMS también es parte de nuestra lógica de negocios. Estamos vendiendo servicios alojados para que nuestros clientes puedan ver todos los mensajes SMS que se envían en su nombre. Debido a que el envío del mensaje se realiza fuera del dominio, no podemos hacerlo.

Así que creamos un dominio SMS y ahora, cuando el detector de eventos recibe NewCustomerCreatedEvent, el controlador de eventos crea un nuevo comando SendSmsMessageCommand que creará un nuevo objeto SMSMessage en nuestro dominio, envía la notificación de SMS y crea un evento SmsSent que usamos para crear el ver.

Al principio enviábamos el mensaje SMS en el modelo de dominio, pero nos dimos cuenta de que esto podría dar algunos problemas. Digamos que después de enviar el SMS algo sucede (se lanza una excepción) y la transacción se revierte. Nuestro dominio admite esto completamente, así que los datos están bien, pero el mensaje SMS ya se envió, por lo tanto, cuando se reenvíe el comando, la notificación SMS se enviará nuevamente.

Estábamos pensando en enviar el SMS en el evento SmSSent pero eso sería un poco extraño, porque el evento dice que el mensaje ya está enviado pero no lo está.

El ejemplo anterior nos lleva a la pregunta de cómo abordar la comunicación externa en el CQRS y el concepto de diseño impulsado por el dominio. No solo estamos hablando de enviar una notificación por SMS, sino también de enviar una factura a un sistema de facturación externo y todo otro tipo de comunicación al mundo exterior. ¿Debemos hacer esto en el dominio porque es lógica de negocios o debemos hacerlo siempre en función de los eventos en nuestros controladores de eventos? Y si lo hacemos, ¿es aceptable usar eventos que digan que el mensaje se envía cuando aún no se ha terminado?

Espero que ustedes ya hayan lidiado con esta situación y puedan darnos algunos consejos sobre este tema.


Podría usar una Saga o un Administrador de procesos como Microsoft lo llama. Básicamente, esto escucha los eventos, que cambian el estado de la saga, y emite comandos basados ​​en la lógica de estado implementada en la saga.

En su caso, sería una saga de dos estados, que espera tanto CustomerCreatedEvent como OrderCreatedEvent, y, o bien emite un comando para enviar un sms, si tiene un contexto de comunicación especializado especializado, o llama a un servicio de infraestructura a través de una interfaz. enviar los sms.

Aquí puede encontrar el artículo de Microsoft sobre el patrón de saga / proceso administrador:

https://msdn.microsoft.com/en-us/library/jj591569.aspx

Y dos artículos que contienen implementaciones:

http://danielwhittaker.me/2015/03/31/how-to-send-emails-the-right-way-in-a-cqrs-system/

http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/