2010-08-05 37 views
6

tengo el siguiente escenario, que necesito para poner en práctica siguiendo el patrón CQRS:CQRS - La consistencia eventual

  1. un usuario inicia sesión en
  2. el usuario entra en algunos detalles del seguro
  3. al usuario solicitar una decisión de para ser aplicado
  4. el usuario ve el resultado de la decisión

Ésta parece bastante sencillo, sin embargo mis probl em está entre los pasos 3 y 4, en el paso 3, envío un comando ApplyForDecision que recibirá una decisión de un servicio de suscripción, un evento con el resultado de esa decisión se envía al BUS para la tienda de lectura para consumirlo más tarde y actualizar las tablas de vista con el resultado de la decisión.

El problema está en la interfaz de usuario, ¿cómo informo al usuario de que se está aplicando la decisión, ya que en CQRS el modelo de lectura no se actualiza de inmediato? ¿Cómo hago para que la UI muestre que una decisión está en progreso? y 'pronto' llegará?

También necesito dar al usuario la posibilidad de cerrar la sesión y volver a iniciar sesión, ya que la decisión puede no haberse aplicado aún, ¿cómo hago que la UI muestre la 'pantalla de decisión pendiente'?

+0

¿La interfaz de usuario es el cliente web o un cliente inteligente? – stung

+1

¿Se ha cambiado el estado de alguna manera? Quiero decir, ¿esta aplicación de decisión es alguna forma de cálculo que necesita ser confirmada? Si es así, ¿esto es visible para los "otros" en el sistema? ¿Cómo es este escenario altamente colaborativo? –

Respuesta

3

En mi humilde opinión, la solución sería dejar que su comando emita un evento "ApplyForDecisionRequested" y un evento "ApplyForDecisionHandled" y actualice su modelo de lectura en consecuencia.

7

La respuesta es plantear inmediatamente un evento indicando que se ha solicitado la decisión, actualizar el DB de lectura y redirigir directamente a su pantalla de decisión pendiente, haya o no se haya actualizado el DB de lectura para ese momento. Texto estático 'Decisión pendiente será contactado' o algo similar. Se pueden actualizar o volver más tarde y es muy probable que obtengan los datos reales. Luego, cuando se ha decidido la decisión, tiene un evento DecisionMade y actualiza el DB de lectura, envía correos electrónicos, en cualquier caso, en consecuencia.

Esa es la compensación con la consistencia eventual que tiene que tratar en CQRS. A menudo, cuando realizo cambios en las propiedades de un objeto de dominio en un formulario, lo falsifico en los comentarios inmediatos que recibe el usuario mientras el servidor hace sus quehaceres. Sí, un poco feo, pero los usuarios no lo saben.

+2

Buena respuesta, especialmente sobre el hecho de que el usuario no sabe. Esa es la clave, asegúrese de que el usuario no se dé cuenta. Por ejemplo, puede almacenar dentro del navegador o caché del servidor que el elemento se actualizó. Cuando accede al modelo de lectura para datos y en su caché nota que los datos aún no se han actualizado, lo hace usted mismo, pero solo para este usuario. SignalR también es ideal para actualizar otros clientes lo más rápido posible. –

Cuestiones relacionadas