Recentemente ho iniziato a immergermi in CQRS / ES perché potrei aver bisogno di applicarlo al lavoro. Sembra molto promettente nel nostro caso, in quanto risolverebbe molti problemi.
Ho abbozzato la mia comprensione approssimativa su come un'app ES / CQRS dovrebbe apparire contestualizzata a un caso di utilizzo bancario semplificato (prelevare denaro).
Per riassumere, se la persona A ritira dei soldi:
- viene emesso un comando Il comando
- viene consegnato per la convalida / verifica
- un evento viene trasferito in un archivio eventi se la convalida ha esito positivo
- un aggregatore deseleziona l'evento per applicare modifiche all'aggregato
Da quello che ho capito, il registro eventi è la fonte della verità, poiché è il registro dei FATTI, quindi possiamo ricavarne qualsiasi proiezione.
Ora, ciò che non capisco, in questo grande schema di cose, è ciò che accade in questo caso:
- regola: un saldo non può essere negativo
- la persona A ha un saldo di 100e
- persona A emette un WithdrawCommand di 100e
- i passaggi di convalida e MoneyWithdrewEvent di 100e vengono emessi
- nel frattempo, la persona A emette un altro WithdrawCommand of 100e
- il primo MoneyWithdrewEvent non è stato aggregato e pertanto i passaggi di convalida, perché il controllo di convalida rispetto all'aggregato (che non è ancora stato aggiornato)
- MoneyWithdrewEvent di 100e viene emesso un'altra volta
== > Siamo in uno stato incoerente di un saldo a -100e e il log contiene 2 MoneyWithdrewEvent
Come ho capito ci sono diverse strategie per far fronte a questo problema:
- a) inserisce l'ID della versione aggregata insieme all'evento nell'archivio degli eventi, quindi se c'è una versione non corrispondente alla modifica, non accade nulla
- b) utilizza alcune strategie di blocco, il che implica che il livello di verifica deve in qualche modo crearne uno
Domande relative alle strategie:
- a) In questo caso, il registro eventi non è più la fonte della verità, come affrontarlo? Inoltre, siamo tornati al client OK mentre era totalmente sbagliato consentire il ritiro, è meglio in questo caso utilizzare i blocchi?
- b) Serrature == deadlock, hai qualche informazione sulle migliori pratiche?
Nel complesso, la mia comprensione è corretta su come gestire la concorrenza?
Nota: capisco che la stessa persona che ritira due volte il denaro in una finestra così breve è impossibile, ma ho preso un semplice esempio, per non perdermi nei dettagli