todavía estoy luchando con lo que debe ser cuestiones básicas (y resuelto) relacionados con CQRS arquitectura de estilo:ejecución limitaciones basadas en el conjunto de CQRS
¿Cómo implementamos las reglas de negocio que se basan en un conjunto de agregado Roots?
Tome, por ejemplo, una aplicación de reserva. Puede permitirle reservar entradas para un concierto, asientos para una película o una mesa en un restaurante. En todos los casos, solo va a haber un número limitado de de 'artículos' a la venta.
Imaginemos que el evento o lugar es muy popular. Cuando las ventas se abren para un nuevo evento o intervalo de tiempo, las reservas comienzan a llegar muy rápido, tal vez muchas por segundo.
En el lado de la consulta, podemos escalar de forma masiva, y las reservas se colocan en una cola para ser manejadas asincrónicamente por un componente autónomo. Al principio, cuando sacamos Comandos de reserva de la cola, los aceptaremos, pero en un momento dado tendremos que iniciar rechazando el resto.
¿Cómo sabemos cuándo llegamos al límite?
Para cada comando de reserva tendríamos que consultar algún tipo de tienda para averiguar si podemos acomodar la solicitud. Esto significa que necesitaremos saber cuántas reservas ya hemos recibido en ese momento.
Sin embargo, si el Almacén de dominio es un almacén de datos no relacional como p. Ej. Tabla de almacenamiento de Windows Azure, que no puede muy bien hacer una opción SELECT COUNT(*) FROM ...
Uno sería mantener un separada agregada Raíz que simplemente se hace un seguimiento de la cuenta corriente, así:
- AR: reserva (que cuántos?)
- AR:/Hora del evento ranura/Fecha (recuento agregada)
el segundo agregado de raíz sería una agregación desnormalizado de la primera, pero cuando el underlyi ng data store no es compatible con las transacciones, entonces es muy probable que estas se desincronicen en escenarios de gran volumen (que es lo que intentamos abordar en primer lugar).
Una posible solución es serializar manejo de los comandos de reserva para que solo se maneje uno a la vez, pero esto va en contra de nuestros objetivos de escalabilidad (y redundancia).
Estos escenarios me recuerdan a los escenarios estándar "sin stock", pero la diferencia es que no podemos poner la reserva en orden inverso. Una vez que se agota un evento, se agota, por lo que no puedo ver qué acción compensatoria sería.
¿Cómo manejamos tales escenarios?
Nada le impide agregar un tercer recurso, que contiene A y B como sub-recursos, y actualizar eso. Otra solución alternativa para crear un recurso de transacción temporal. No creo que mover las transacciones a los clientes de REST merezca la pena. – inf3rno