Нещодавно я почав занурюватися в CQRS / ES, тому що мені може знадобитися застосувати це на роботі. Це здається дуже перспективним у нашому випадку, оскільки це вирішило б багато проблем.
Я накреслив своє грубе розуміння того, як додаток ES / CQRS повинен виглядати контекстуально під спрощений випадок використання банківських операцій (зняття грошей).
Просто підводячи підсумки, якщо людина A знімає гроші:
- команда видається
- команда передається для перевірки / перевірки
- подія висувається в магазин подій, якщо перевірка успішна
- агрегатор відмовляється від події застосувати зміни до сукупності
З того, що я зрозумів, журнал подій є джерелом істини, оскільки це журнал ФАКТІВ, ми можемо вивести з нього будь-яку проекцію.
Тепер, що я не розумію, в цій грандіозній схемі речей, що відбувається в цьому випадку:
- правило: баланс не може бути негативним
- людина A має баланс 100e
- особа A видає ВиведенняCommand 100e
- перевірка валідації та випромінюється подія MoneyWithdrewEvent of 100e
- тим часом, людина A видає ще один WithdrawCommand 100e
- перший MoneyWithdrewEvent ще не зведений, тому перевірка проходить, тому що перевірка перевірки сукупності (що ще не оновлено)
- MoneyWithdrewEvent з 100e випромінюється в інший раз
==> Ми знаходимось у несуперечливому стані балансу на рівні -100e, а журнал містить 2 MoneyWithdrewEvent
Як я розумію, існує декілька стратегій для вирішення цієї проблеми:
- а) помістіть сукупний ідентифікатор версії разом із подією в сховище, так що якщо при модифікації є невідповідність версії, нічого не відбувається
- б) використовувати деякі стратегії блокування, маючи на увазі, що шар перевірки повинен якось створити його
Питання, що стосуються стратегій:
- а) У цьому випадку журнал подій вже не є джерелом істини, як з цим боротися? Крім того, ми повернулися до клієнта ОК, тоді як дозволити відкликання було абсолютно неправильно, чи краще в цьому випадку користуватися замками?
- б) Замки == тупики, чи маєте ви уявлення про кращі практики?
Загалом, чи правильно я розумію, як поводитися з одночасністю?
Зауважте: я розумію, що та сама людина вилучає двічі гроші за такий короткий проміжок часу, що неможливо, але я взяла простий приклад, щоб не загубитися в деталі