Me encontré con el diseño de Event Sourcing y me gustaría usarlo en una aplicación donde se necesita un cliente REST (RESTful para ser precisos). Sin embargo, no puedo conectarlos, ya que REST es bastante CRUDO y el abastecimiento de eventos se basa en tareas. Me preguntaba cómo puede diseñar la creación de comandos basados en solicitudes al servidor REST. Considere este ejemplo:
Con REST puede poner un nuevo estado al recurso llamado Archivo. En una solicitud, puede enviar un nuevo nombre de archivo, puede cambiar la carpeta principal y / o cambiar el propietario del archivo, etc.
Cómo construir el servidor para que pueda usar el abastecimiento de eventos. Estaba pensando en estas posibilidades:
Determinar el servidor de los campos que se han cambiado y crear comandos apropiados (
RenameFileCommand
,MoveFileCommand
,ChangeOwnerCommand
, ...) y envían estos de forma individual. Sin embargo, en esta configuración, cada uno de los comandos puede fallar dejando a otros fuera de la transacción y, por lo tanto, fuera del cambio "atómico" del recurso.Despacho sólo un comando (
UpdateFileCommand
) y en el controlador de comandos, más precisamente en el agregado, determinar qué campos se han cambiado y enviar eventos individuales en lugar (FileRenamedEvent
,FileMovedEvent
,OwnerChangedEvent
, ...)Este no me gusta en absoluto: en la solicitud al servidor, especificaría en los encabezados qué comando usar, porque la interfaz de usuario todavía está basada en tareas (pero la comunicación se realiza a través de REST). Sin embargo, fallará en cualquier otro uso de la comunicación REST (por ejemplo, en aplicaciones externas) ya que no están obligados a cambiar solo un campo en una solicitud. También traigo un acoplamiento bastante grande en la interfaz de usuario, REST y back-end basado en ES.
¿Cuál preferirías o hay alguna forma mejor de manejar esto?
Nota al margen: aplicación escrita en Java y Axon Framework para el abastecimiento de eventos.