2011-04-07 12 views
18

Actualmente estamos evaluando arquitecturas CQRS y Event Sourcing. Estoy tratando de entender cuáles son las implicaciones de mantenimiento de usar este tipo de diseño. Dos preguntas Estoy luchando para encontrar respuestas a son esto:Cómo administrar los cambios de ViewModel en CQRS + Event Sourcing Architecture

1) ¿Qué pasa si, después de una aplicación ha estado funcionando durante un tiempo, hay un nuevo requisito para agregar un campo adicional a un modelo de vista sobre la Base de datos de ReadModel? Supongamos que se requiere el código postal del cliente en CustomerList ViewModel, donde no estaba previamente. Entonces, la columna adicional se puede agregar fácilmente a la base de datos de ViewModel, pero ¿cómo se puede poblar? Por lo que puedo ver, la única forma es borrar la base de datos de lectura y reproducir todos los eventos desde cero para crear una copia de seguridad de la base de datos de ReadModel. Pero, ¿y si la aplicación ha estado en funcionamiento durante meses o años (como esperamos que sea)? Esto podría ser millones de eventos para reproducir, solo para agregar datos para una columna de código postal.

Tengo la misma preocupación si, por cualquier razón técnica, la base de datos de ReadModel no se sincronizó, o si deseamos agregar una nueva base de datos de ReadModel. Parece que cuanto más antigua es la aplicación, y cuanto más se usa, más difícil y más caro es obtener un modelo de lectura actualizado. ¿O me estoy perdiendo un truco en alguna parte? Algo así como instantáneas de ReadModel?

2) ¿Qué pasa si después de todos los millones de eventos que se hayan reproducido para construir una copia de seguridad la base de datos de lectura, algunos de los datos no se alinean con lo que se esperaba (es decir, se ve mal). Se cree que tal vez un error en algún lugar del evento almacenando, o rutinas de desnormalización puede haber causado esto (y parece que si hay algo en lo que puede confiar en la codificación, es en los errores). ¡Cómo hacer para depurar esto! Parece una tarea imposible. O tal vez, de nuevo, me estoy perdiendo un truco.

Me gustaría saber de alguien que ha estado utilizando un sistema como este durante un tiempo, cómo las rutas de mantenimiento y actualización han funcionado para usted.

Gracias por cualquier hora y entrada.

Respuesta

16

La belleza de la utilización evento de abastecimiento con CQRS es la capacidad de destruir el modelo de lectura y reconstruirlo desde cero, como se ha mencionado. Por algún motivo, las personas tienen la idea de que pasará mucho tiempo después de superar un número arbitrario de eventos. Si está utilizando una base de datos relacional para sus modelos de lectura, y lo más probable es que sea así, es fácil abrir una transacción, leer todos los eventos a través de los controladores y luego confirmar la transacción. Solo cuando la transacción se compromete, realmente tocamos el disco. Todo lo demás se realiza en la memoria, por lo que puede ser muy rápido. De hecho, no me sorprendería ver que tu sistema funciona a través de unos pocos millones de eventos en tan solo unos minutos, si es así.

la reconstrucción de su modelos de lectura a partir de cero deben mostrar la misma manera como su método cotidiano de desnormalización los eventos en los modelos de lectura. Si no, tienes un error en el código de desnormalización de tu modelo de lectura. Lo mejor de todo es que, desde la perspectiva de su manejador de mensajes, no hay diferencia entre un evento que se recibe y se desnormaliza en el modelo de lectura durante escenarios de producción/regulares y para escenarios de reconstrucción de modelos de lectura.

Si encuentra errores, puede depurar fácilmente mediante la transmisión/copia de los eventos de producción a su estación de trabajo local, establecer puntos de interrupción en sus controladores y luego ejecutar esos eventos a través del código de manejo del modelo de lectura.

+0

Gracias por su respuesta. Tus puntos de vista sobre el tiempo de reproducción del evento que no es un problema (incluso para millones de eventos) son tranquilizadores. Disfruto de tu blog. Por cierto, ¡gracias por compartir! – James

+1

Definitivamente querrá hacer algunas pruebas porque la población del modelo de visualización * puede * ser lenta si lo hace incorrectamente. Se necesita un poco de esfuerzo para hacerlo rápido. –

+0

Hemos estado en la práctica o reconstruyendo nuestro modelo de lectura en cada intento de producción. Primero reconstruimos los datos empujándolo a nuestro modelo de lectura de escenario y, si la reconstrucción tiene éxito, haremos la reconstrucción y la aplicaremos a nuestro modelo de lectura de producción. Para nosotros, garantiza que el modelo de lectura refleje todas las modificaciones a los manejadores de eventos en cada lanzamiento. –

1

Soy algo nuevo en CQRS, por lo que esta puede no ser la ruta más recomendable (pero iirc lo recogí de una de las listas de correo de CQRS/DDDD).

Creamos un comando y un manejador correspondiente específico para el propósito que se espera que se ejecute una vez que se desaprobe.

En el controlador utilizamos el mecanismo que sea conveniente, así que en su caso de agregar un campo de código postal, podemos ejecutar una consulta única que extraiga los códigos postales en ese momento de otro modelo de vista y llene la nueva columna . No nos preocupamos demasiado por la pureza arquitectónica en estos escenarios, ya que se espera que sea una operación de una sola vez (Rob Conery's Massive se ha utilizado con éxito en estas situaciones).

1

Todavía no tengo la aplicación lista para producción usando cqrs con fuentes de eventos, así que aquí está mi experiencia tratando de construir una.

1) Read Model rebuild. Sí, básicamente tienes que reconstruir todo el modelo de lectura DB una vez que algo en él cambie. Y si hay muchos eventos, esto puede llevar mucho tiempo. Por lo tanto, la reconstrucción del modelo de lectura debe estar altamente optimizada (uso de lotes de eventos, etc.). Siento que el aprovisionamiento de eventos se adapta mejor en los casos en que hay una alta relación de lectura-escritura. Entonces, para algunos datos extremadamente volátiles, puede ser prudente no almacenarlos como eventos de dominio. Pero entonces la pregunta sobre la capacidad de almacenamiento tampoco está muy lejos. En cualquier caso, puede aplicar cqrs a solo una parte del sistema, donde se ajusta mejor (por ejemplo, probablemente no almaceno una imagen gráfica como parte del evento).

2) Debugging. Es altamente improbable que no hay error en caso de almacenamiento (que debería ser la preocupación de un marco), y siempre es fácil de comprobar qué eventos en la tienda. En cuanto al comando para producir eventos esperados, debe tener pruebas aquí, y estas pruebas probablemente serán las más valiosas en el sistema. Para los desnormalizadores, también podría tener pruebas, pero no me molestaría en escribir pruebas para desnormalizadores triviales si su corrección se puede ver a simple vista. Dicho esto, utilicé el depurador unas cuantas veces para encontrar problemas en algunos denormalizadores más complicados; No fue tan divertido intentar determinar qué evento hizo que las cosas salieran mal.

0

También es posible añadir en un evento de red en el modelo. Esto se puede ejecutar como una tarea arbitraria después de que se recibió X cantidad de eventos (digamos 500)

Para reconstruir, inserta sus eventos en una pila hasta que golpee el evento de compensación, esto se usa como referencia, desde aquí sacas los eventos de tu pila agregando sus valores con tu evento de referencia.

Cuestiones relacionadas