Lesson 67 — CQRS & Event Sourcing

Ba module tương tác: (1) Event Sourcing replay — fold chuỗi event để dựng state, kèm time-travel slider; (2) CQRS — write model (validate) tách khỏi read model (denormalized), sync qua projection; (3) Snapshot — so sánh chi phí replay từ đầu vs từ snapshot.

1. Event Sourcing — replay & time travel

Tài khoản KHÔNG lưu balance. State = events.reduce(apply). Kéo slider để "tua" tới event thứ k và xem balance tại đúng thời điểm đó (time travel). Thêm event để mở rộng lịch sử.

Tua tới event:
Balance tại thời điểm này
0
Version (số event đã apply)
0

2. CQRS — write model vs read model

Bên WRITE nhận command, validate business rule (đơn ≥ 1 món, tổng > 0), lưu normalized. Bên READ là projection denormalized — gom sẵn tổng tiền, số món. Thử gửi command hợp lệ và không hợp lệ.

Command
"hãy đặt đơn"
Write model
validate + lưu normalized
Projection
denormalize
Read model
đọc nhanh, gom sẵn
Chưa có command nào.

WRITE Write store (normalized)

OrderIDCustomerItems (raw)

READ Read model (denormalized)

OrderIDKháchTổngSố món

3. Snapshot — chi phí replay

Một aggregate có nhiều event. Đọc state = replay. Snapshot mỗi N event giúp chỉ phải replay phần sau snapshot gần nhất. Chỉnh tổng event và khoảng snapshot để thấy chi phí thay đổi.

Tổng event: 250
Snapshot mỗi: 100

Không snapshot

Có snapshot