2011-10-10 10 views
5

Digamos que quería tener una saga creada por algún evento, luego me senté y esperé durante unas horas, y si no pasa nada, envía algún comando.Sagas basadas en tiempo con Event Sourcing

Ahora, si esta Saga estaba todo en la memoria y tuve que reiniciar la aplicación/servidor, la saga se descargaría y nunca se volvería a ver, ¿verdad?

¿Utilizaría Event Sourcing para acelerar esta Saga una vez que el sistema vuelva a estar en línea?

Si es así, necesitaría prácticamente una tienda de eventos separada con "sagas activas" que se puedan reproducir al inicio del sistema, para que mis Sagas se pongan al día. Hasta ahora, me parece bien, pero ¿cómo implementaría el tiempo de espera?

Necesitaría alguna manera de "simular" los tiempos de espera en la reproducción, teniendo en cuenta que puede haber varios tiempos de espera dependiendo de los eventos que entren en la saga.

Respuesta

6

La mejor manera de lograr esta capacidad es con otro endpoint que sea capaz de devolverle un mensaje en un momento determinado. Por ejemplo, tu saga puede enviar un mensaje a este "administrador de tiempo de espera" y decir "despertarme" en 1 hora o 1 día o incluso 1 año. El mensaje se le devolverá en ese momento. Idealmente, este mensaje tendría un significado comercial que causaría una acción.

Quizás el mejor ejemplo de esto es algo así como el registro de clientes donde, si el cliente no ha confirmado su cuenta dentro de los 7 días posteriores al registro, se los notificaría por correo electrónico. El "mensaje de tiempo de espera" sería efectivamente: RemindUserToConfirmAccountMessage. Cuando la saga vuelva a recibir este mensaje después de 7 días, la saga determinará en función de su estado actual, si ese mensaje debe ser manejado y se debe enviar un correo electrónico del cliente. Pero si el usuario ya ha confirmado su cuenta, el mensaje puede descartarse sin que se tome ninguna medida.

+0

¿Cómo puedo hacer una saga que viva durante 7 días? Estoy seguro de que debe persistir en caso de reinicio del servicio, ¿verdad? –

+1

@MauroDestro Realmente no tiene que mantener sus sagas en la memoria cuando usa Event Sourcing. Piense en una saga como una entidad que puede reproducir antes de que deba manejar un Evento. Compare cómo reproduciría un agregado antes de que deba manejar un comando. Usar el enfoque de Jonathan para manejar los tiempos muertos (convirtiéndolos en eventos en sí mismos) hace posible reproducir el "tiempo" también. –

Cuestiones relacionadas