Supongamos que queremos implementar un pequeño subsistema de seguridad para una aplicación financiera que advierte a los usuarios por correo electrónico si se detecta un patrón extraño. Para este ejemplo, el patrón consistirá en tres transacciones como las representadas. El subsistema de seguridad puede leer eventos desde el sistema principal desde una cola.
Lo que me gustaría recibir es una alerta que es una consecuencia directa de los eventos que suceden en el sistema, sin una representación intermedia que modele el estado actual del patrón.
- Monitoreo activado
- Transacción procesada
- Transacción procesada
- Transacción procesada
- Alerta activada (id: 123)
- Correo electrónico para alerta enviada (para id: 123)
- Transacción procesada
Teniendo esto en cuenta, pensé que el abastecimiento de eventos podría aplicarse muy bien aquí, aunque tengo una pregunta sin una respuesta clara. La alerta activada en el ejemplo tiene un efecto secundario claro, se debe enviar un correo electrónico, una circunstancia que solo debería ocurrir una vez. Por lo tanto, no debería suceder cuando se reproducen todos los eventos de un agregado.
Hasta cierto punto, veo el correo electrónico que debe enviarse de manera similar a las materializaciones generadas por el lado de la consulta que he visto tantas veces en la literatura de abastecimiento de CQRS / Evento, con una diferencia no tan sutil.
En esta literatura, el lado de la consulta está construido a partir de controladores de eventos que pueden generar una materialización del estado en un punto dado, leyendo nuevamente todos los eventos. En este caso, sin embargo, eso no se puede lograr exactamente así por las razones explicadas anteriormente. La idea de que cada estado es transitorio no se aplica tan bien aquí . Necesitamos registrar el hecho de que se envió una alerta a alguna parte.
Una solución fácil para mí sería tener una tabla o estructura diferente donde guardar registros de las alertas que se activaron previamente. Como tenemos una identificación, podríamos verificar si antes se emitió una alerta con la misma identificación. Tener esta información haría que SendAlertCommand sea idempotente. Se pueden emitir varios comandos, pero el efecto secundario solo ocurrirá una vez.
Incluso teniendo en cuenta esa solución, no sé si esto es una pista de que hay algo mal con esta arquitectura para este problema.
- ¿Es correcto mi enfoque?
- ¿Hay algún lugar donde pueda encontrar más información sobre esto?
Es extraño que no haya podido encontrar más información sobre esto. Tal vez he estado usando una redacción incorrecta.
Muchas gracias!