← Bütün Patternlər
📼

Event Sourcing

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.

🎯
Nə üçün lazımdır?

Audit trail, debugging və tarixçə lazım olan sistemlərdə (bank, e-ticarət) state-in niyə/necə dəyişdiyini bilmək vacibdir.

📚
Əsas prinsip

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.

🛠️
Populyar alətlər

Axon Framework, EventStoreDB, Apache Kafka (event log kimi), Eventuate.

İNTERAKTİV

Vizual İzah

Mərhələ {{ currentStep + 1 }}: {{ steps[currentStep].title }}

#{{ i+1 }} {{ evt.icon }} {{ evt.type }} {{ evt.data }}
Cari Balans = {{ balance }} ₼
(Bütün eventlərin replay-i ilə hesablanır)
JAVA

Kod Nümunəsi — Event Sourcing

BankAccountAggregate.java
// 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());
    }
}
✅ Üstünlükləri
  • Tam audit trail — hər dəyişiklik qeydə alınır
  • İstənilən zamanda keçmiş vəziyyətə qayıtmaq mümkündür
  • Eventual Consistency üçün idealdır (CQRS ilə)
  • Debugging çox asandır
⚠️ Riskləri
  • Event Store böyüdükcə replay yavaşlayır (Snapshot lazım)
  • Event versiyalaşdırma (schema evolution) çətindir
  • Öyrənmə əyrisi yüksəkdir