![Page 1: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/1.jpg)
CQRS & EVENT SOURCING IN THE WILD
Michiel Rook - @michieltcs
![Page 2: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/2.jpg)
➤ Developer, consultant, trainer, speaker
➤ @michieltcs
![Page 3: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/3.jpg)
YOU
![Page 4: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/4.jpg)
RAISE YOUR HAND
IF YOU HAVE
![Page 5: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/5.jpg)
read CQRS / Event Sourcing theory
RAISE YOUR HAND
IF YOU HAVE
![Page 6: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/6.jpg)
read CQRS / Event Sourcing theory
followed a tutorial, built a hobby project
RAISE YOUR HAND
IF YOU HAVE
![Page 7: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/7.jpg)
read CQRS / Event Sourcing theory
followed a tutorial, built a hobby project
used it in production
RAISE YOUR HAND
IF YOU HAVE
![Page 8: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/8.jpg)
![Page 9: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/9.jpg)
QUICK RECAP
![Page 10: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/10.jpg)
' Event Sourcing ensures that all changes to application state are stored as a sequence of events.
-Martin Fowler
![Page 11: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/11.jpg)
ACTIVE RECORD VS. EVENT SOURCING
Account Id Account number Balance1234 12345678 �€50.00
... ... ...
Money WithdrawnAccount Id 1234
Amount �€50.00
Money DepositedAccount Id 1234
Amount �€100.00
Account OpenedAccount Id 1234
Account number 12345678
@michieltcs
![Page 12: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/12.jpg)
COMMANDS TO EVENTS
Deposit MoneyAccount Id 1234
Amount �€100.00
class DepositMoney { @TargetAggregateIdentifier public String accountId; public BigDecimal amount; }
@michieltcs
![Page 13: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/13.jpg)
COMMANDS TO EVENTS
Deposit MoneyAccount Id 1234
Amount �€100.00
@CommandHandler public void depositMoney(DepositMoney command) { apply(new MoneyDeposited( command.getAccountId(), command.getAmount(), ZonedDateTime.now())); }
command handler
@michieltcs
![Page 14: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/14.jpg)
COMMANDS TO EVENTS
Deposit MoneyAccount Id 1234
Amount �€100.00
Money DepositedAccount Id 1234
Amount �€100.00
class MoneyDeposited { public String accountId; public BigDecimal amount; public ZonedDateTime timestamp; }
command handler
@michieltcs
![Page 15: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/15.jpg)
AGGREGATES
class BankAccount { @AggregateIdentifier public String accountId; public String accountNumber; public BigDecimal balance; // ... @EventHandler public void accountOpened(AccountOpened event) { this.accountId = event.getAccountId(); this.accountNumber = event.getAccountNumber(); this.balance = BigDecimal.valueOf(0); } @EventHandler public void moneyDeposited(MoneyDeposited event) { this.balance = this.balance.add(event.getAmount()); } } @michieltcs
![Page 16: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/16.jpg)
AGGREGATE STATE
Account number Balance12345678 �€0.00
Account number Balance12345678 �€100.00
Account number Balance12345678 �€50.00
event handler
event handler
event handler
@michieltcs
Money WithdrawnAccount Id 1234
Amount �€50.00
Money DepositedAccount Id 1234
Amount �€100.00
Account OpenedAccount Id 1234
Account number 12345678
![Page 17: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/17.jpg)
Domain
UI
Event Bus
Event Handlers
Command
Repository
Data Layer
Database Database
Event Store
commands
events
events
queries DTOs
Aggregates
@michieltcs
![Page 18: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/18.jpg)
REPLAYS AND REBUILDS
![Page 19: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/19.jpg)
ANSWERING QUERIES
![Page 20: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/20.jpg)
BASED ON EVENTS
![Page 21: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/21.jpg)
QUERIES
Account Opened
Account Opened
Account Closed Number of active accounts?
@michieltcs
![Page 22: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/22.jpg)
QUERIES
Money Deposited
Money Withdrawn
Interest Received
Accounts with balance > �€100?
Money Deposited
Money Withdrawn
@michieltcs
![Page 23: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/23.jpg)
PROJECTION
Account Opened Event Handler
# of active
accounts +1
Account Closed Event Handler
# of active
accounts -1
@michieltcs
![Page 24: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/24.jpg)
PROJECTION
Events Event Handler(s) Storage
@michieltcs
![Page 25: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/25.jpg)
NEW PROJECTION
![Page 26: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/26.jpg)
NEW STRUCTURE
![Page 27: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/27.jpg)
BASED ON EXISTING EVENTS
![Page 28: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/28.jpg)
REBUILDING
Stop app CleanupLoop over events
Apply to projection Start app
@michieltcs
![Page 29: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/29.jpg)
ZERO DOWNTIME
Loop over existing events
Apply to new
projection
Use projection
@michieltcs
![Page 30: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/30.jpg)
ZERO DOWNTIME
New events Queue
Loop over existing events
Apply to new
projection
Apply queued events
Use projection
@michieltcs
![Page 31: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/31.jpg)
ZERO DOWNTIME
Get next event
Apply to new
projectionLast event? Use
projectionyes
no
@michieltcs
![Page 32: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/32.jpg)
LONG RUNNING REBUILDS?
![Page 33: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/33.jpg)
IN MEMORY
![Page 34: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/34.jpg)
DISTRIBUTED
![Page 35: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/35.jpg)
PARTIAL
![Page 36: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/36.jpg)
BACKGROUND TASK
![Page 37: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/37.jpg)
TRACKING EVENT PROCESSOR
@michieltcs
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackedProjection {
}
![Page 38: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/38.jpg)
TRACKING EVENT PROCESSOR
@michieltcs
@Configuration public class ProjectionsConfiguration { @Autowired private EventHandlingConfiguration eventHandlingConfiguration; @PostConstruct public void startTrackingProjections() throws ClassNotFoundException { // ... } }
![Page 39: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/39.jpg)
TRACKING EVENT PROCESSOR
@michieltcs
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); scanner.addIncludeFilter(new AnnotationTypeFilter(TrackedProjection.class)); for (BeanDefinition bd : scanner.findCandidateComponents("org.demo")) { Class<?> aClass = Class.forName(bd.getBeanClassName()); ProcessingGroup processingGroup = aClass.getAnnotation(ProcessingGroup.class); String name = Optional.ofNullable(processingGroup) .map(ProcessingGroup::value) .orElse(aClass.getPackage().getName()); eventHandlingConfiguration.registerTrackingProcessor(name); }
![Page 40: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/40.jpg)
EVENT VERSIONING
![Page 41: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/41.jpg)
NEW BUSINESS REQUIREMENTS
![Page 42: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/42.jpg)
CHANGING VIEW ON EVENTS
![Page 43: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/43.jpg)
IRRELEVANT
![Page 44: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/44.jpg)
DIFFERENT FIELDS
![Page 45: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/45.jpg)
WRONG NAME
![Page 46: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/46.jpg)
TOO COARSE
![Page 47: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/47.jpg)
TOO FINE
![Page 48: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/48.jpg)
SUPPORT YOUR LEGACY?
![Page 49: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/49.jpg)
Commands can be
renamed
1
@michieltcs
![Page 50: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/50.jpg)
Commands can be
renamed
1
Events are immutable
2
@michieltcs
![Page 51: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/51.jpg)
Commands can be
renamed
1
Events are immutable
Correct old events with new events
2 3
@michieltcs
![Page 52: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/52.jpg)
COMPENSATING ACTIONS
class MoneyWithdrawn { String accountId; BigDecimal amount; }
class WithdrawalRolledBack { String accountId; BigDecimal amount; }
Typo: too much withdrawn!
![Page 53: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/53.jpg)
COMPENSATING ACTIONS
class AccountOpened { String accountId; String accountNumber; }
class DuplicateAccountClosed { String accountId; }
Duplicate account number!
![Page 54: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/54.jpg)
UPCASTING
![Page 55: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/55.jpg)
UPCASTING
Event Store
@michieltcs
![Page 56: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/56.jpg)
UPCASTING
@michieltcs
@Revision("1.0") @Value class AccountOpened { String accountId; String accountNumber; }
![Page 57: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/57.jpg)
UPCASTING
Event Store
AccountOpened (1.0)
Event Handler
@michieltcs
![Page 58: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/58.jpg)
UPCASTING
@Revision("2.0") @Value class AccountOpened { String accountId; String accountNumberIban; }
@michieltcs
![Page 59: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/59.jpg)
UPCASTING
Event Store
AccountOpened (1.0)
Upcaster
AccountOpened (2.0)
Event Handler
@michieltcs
![Page 60: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/60.jpg)
UPCASTING
private static SimpleSerializedType targetType = new SimpleSerializedType(AccountOpened.class.getTypeName(), "1.0"); private static SimpleSerializedType outputType = new SimpleSerializedType(AccountOpened.class.getTypeName(), "2.0");
@michieltcs
![Page 61: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/61.jpg)
UPCASTING
public Stream<IntermediateEventRepresentation> upcast( Stream<IntermediateEventRepresentation> intermediateRepresentations) { return intermediateRepresentations.map(evt -> { if (!evt.getType().equals(targetType)) { return evt; } return evt.upcastPayload(outputType, Document.class, document -> { Element rootElement = document.getRootElement(); Element accountNumberElement = rootElement.element("accountNumber"); rootElement.remove(accountNumberElement); rootElement.addElement("accountNumberIban") .setText(toIban(accountNumberElement.getText())); return document; }); }); }
@michieltcs
![Page 62: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/62.jpg)
VERSIONED EVENT STORE
![Page 63: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/63.jpg)
VERSIONED EVENT STORE
events_v1
[ { "id": "12345678", "type": "AccountOpened", "aggregateType": "Account", "aggregateIdentifier": "1234", "sequenceNumber": 0, "payloadRevision": "1.0", "payload": { ... }, "timestamp": ... ... }, ... ]
@michieltcs
![Page 64: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/64.jpg)
COPY & REPLACE
![Page 65: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/65.jpg)
VERSIONED EVENT STORE
Loop over existing events
Apply upcaster
Add queued events
Use new event store
New events Queue
@michieltcs
![Page 66: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/66.jpg)
VERSIONED EVENT STORE
events_v2
[ { "id": "12345678", "type": "AccountOpened", "aggregateType": "Account", "aggregateIdentifier": "1234", "sequenceNumber": 0, "payloadRevision": "2.0", "payload": { ... }, "timestamp": ... ... }, ... ]
@michieltcs
![Page 67: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/67.jpg)
GDPR
![Page 68: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/68.jpg)
"RIGHT TO ERASURE"
![Page 69: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/69.jpg)
PERSONALLY IDENTIFIABLE INFORMATION
![Page 70: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/70.jpg)
ANONYMIZED OR REMOVED
![Page 71: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/71.jpg)
IMMUTABLE EVENTS?
![Page 72: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/72.jpg)
CONCURRENCY
![Page 73: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/73.jpg)
CONCURRENT COMMANDS
Withdraw MoneyAccount Id 1234
Amount �€50.00
Deposit MoneyAccount Id 1234
Amount �€100.00
?
@michieltcs
![Page 74: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/74.jpg)
PESSIMISTIC LOCKING
Withdraw MoneyAccount Id 1234
Amount �€50.00
Deposit MoneyAccount Id 1234
Amount �€100.00
Account Id Balance
1234 �€100.00
Account Id Balance
1234 �€50.00
wait for lock
lock
@michieltcs
![Page 75: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/75.jpg)
OPTIMISTIC LOCKING
Withdraw MoneyAccount Id 1234
Amount �€50.00
version 1
Deposit MoneyAccount Id 1234
Amount �€100.00
version 1
Account Id Balance1234 �€100.00
version 2
ConcurrencyException
@michieltcs
![Page 76: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/76.jpg)
MULTIPLE INSTANCES
![Page 77: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/77.jpg)
MULTIPLE INSTANCES
Replica
Replica
ReplicaCommands DistributedCommand Bus
CommandHandler
CommandHandler
CommandHandler
CommandHandler
CommandHandler
CommandHandler
CommandHandler
CommandHandler
CommandHandler
@michieltcs
![Page 78: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/78.jpg)
SCALE
![Page 79: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/79.jpg)
PERFORMANCE
Server
@michieltcs
![Page 80: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/80.jpg)
PERFORMANCE
Server
Database
@michieltcs
![Page 81: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/81.jpg)
PERFORMANCE
Server
Database
Framework
@michieltcs
![Page 82: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/82.jpg)
PERFORMANCE
Server
Database
Framework
Language
@michieltcs
![Page 83: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/83.jpg)
PERFORMANCE
Server
Database
Framework
Language
Serializer
@michieltcs
![Page 84: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/84.jpg)
STORAGE
#events
@michieltcs
![Page 85: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/85.jpg)
STORAGE
#events
#aggregates
@michieltcs
![Page 86: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/86.jpg)
STORAGE
#events
#aggregates
#events per aggregate
@michieltcs
![Page 87: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/87.jpg)
STORAGE
#events
#aggregates
#events per aggregate
Serializer
@michieltcs
![Page 88: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/88.jpg)
STORAGE
#events
#aggregates
#events per aggregate
Serializer
Payload
@michieltcs
![Page 89: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/89.jpg)
SNAPSHOTS
Events... ...
997 Account Opened998 Money Deposited999 Money Withdrawn
1000 Money Deposited
@michieltcs
![Page 90: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/90.jpg)
SNAPSHOTS
Events... ...
997 Account Opened998 Money Deposited999 Money Withdrawn
1000 Money Deposited1001 Money Withdrawn
@michieltcs
![Page 91: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/91.jpg)
SNAPSHOTS
Events... ...
997 Account Opened998 Money Deposited999 Money Withdrawn
1000 Money DepositedSNAPSHOT
1001 Money Withdrawn
Events... ...
997 Account Opened998 Money Deposited999 Money Withdrawn
1000 Money Deposited1001 Money Withdrawn
@michieltcs
![Page 92: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/92.jpg)
CLOSING WORDS
![Page 93: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/93.jpg)
CQRS + ES = AWESOME
![Page 94: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/94.jpg)
NO SILVER BULLET
![Page 95: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/95.jpg)
COMPLEXITY
![Page 96: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/96.jpg)
INFRASTRUCTURE
![Page 97: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/97.jpg)
AUDIT TRAIL
![Page 98: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/98.jpg)
SCALABILITY
![Page 99: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/99.jpg)
TESTING
![Page 100: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/100.jpg)
DOMAIN FIT
![Page 101: CQRS & EVENT SOURCING - JAX London · CQRS & EVENT SOURCING IN THE WILD ... IF YOU HAVE. read CQRS / Event Sourcing theory followed a tutorial, built a hobby project RAISE YOUR HAND](https://reader030.vdocuments.us/reader030/viewer/2022040204/5ece5fadb81e72227c288968/html5/thumbnails/101.jpg)
LITERATURE