transactions - event sourcing wikipedia
CQRS: Almacenamiento de eventos y publicación: ¿cómo puedo hacer esto de manera segura? (1)
Su repositorio podría publicar eventos, no tiene que hacerlo. La solución en este caso es usar el almacén de eventos como una cola. Tendría un proceso en segundo plano que supervisa el almacén de eventos en busca de nuevos eventos, los publica (por ejemplo) en un bus y luego los marca como enviados.
Como siempre, hay compensaciones. Es probable que tenga que lidiar con la mensajería y el procesamiento idempotente por lo menos una vez. Es más complejo que usar una transacción distribuida simple.
Jonathan Oliver ha escrito varias publicaciones sobre este tema que podrían ayudarte: Eliminando 2PC , Cómo evito los comités de dos fases , Patrones de idempotencia
Como aprendí en ¿Por qué el repositorio CQRS publica eventos, no el almacén de eventos? Es la tarea del repositorio CQRS publicar eventos. Hasta ahora tan bueno.
Por supuesto, almacenar los eventos y publicarlos debe estar dentro de una sola transacción. Técnicamente, esto significa escribir uno (o más) registros en la tienda y publicar uno (o más) eventos en un bus de mensajes. Por lo tanto, una simple transacción de base de datos no es suficiente, debe ser una distribuida.
Ahora, desafortunadamente, muchas bases de datos NoSQL (como MongoDB) no admiten transacciones compatibles con ACID, ni siquiera para hablar de la posibilidad de que tenga lugar en una transacción distribuida. Además, hay colas de mensajes que tampoco son compatibles con las transacciones distribuidas.
Entonces la pregunta es: ¿Cómo lidiar con esto?
¿Hay un patrón recomendado para usar?