Cari vəziyyəti (state) saxlamaq əvəzinə, ona gətirib çıxaran bütün hadisələri (event) ardıcıl saxlayır — bank hesabı çıxarışı kimi.
Audit trail, debugging və tarixçə lazım olan sistemlərdə (bank, e-ticarət) state-in niyə/necə dəyişdiyini bilmək vacibdir.
UPDATE əvəzinə INSERT — hər dəyişiklik immutable (dəyişilməz) event kimi Event Store-a yazılır. Cari vəziyyət eventlərin replay-i ilə hesablanır.
Axon Framework, EventStoreDB, Apache Kafka (event log kimi), Eventuate.
// Axon Framework ilə Event Sourcing
@Aggregate
public class BankAccountAggregate {
@AggregateIdentifier
private String accountId;
private BigDecimal balance = BigDecimal.ZERO;
// Komanda gəldikdə Event yarat (INSERT, UPDATE yox!)
@CommandHandler
public void handle(DepositCommand cmd) {
AggregateLifecycle.apply(
new MoneyDepositedEvent(cmd.getAccountId(), cmd.getAmount())
);
}
// Event tətbiq olunduqda state yenilənir
@EventSourcingHandler
public void on(MoneyDepositedEvent event) {
this.balance = this.balance.add(event.getAmount());
}
@EventSourcingHandler
public void on(MoneyWithdrawnEvent event) {
this.balance = this.balance.subtract(event.getAmount());
}
}