Lesson 65 — Event-Driven Architecture
Ba mô-đun tương tác: (1) Choreography vs Orchestration — chạy luồng
order → payment → inventory → ship theo cả hai cách, xem cách điều phối khác nhau;
(2) Outbox pattern — thấy ghi DB + outbox atomic, poller publish, và vì sao nó an toàn khi crash;
(3) Event vs Command vs Query — tự phân loại 8 thông điệp.
1. Choreography vs Orchestration
Cùng luồng 4 service. Choreography: mỗi service nghe event của bước trước và tự phát event tiếp — không có nhạc trưởng. Orchestration: một orchestrator gửi command tới từng service rồi chờ reply. Bật "inventory fail" để thấy logic compensation chạy khác nhau ra sao.
2. Outbox pattern — atomic + crash safety
Tạo order: ghi bảng orders + bảng outbox trong cùng transaction.
Bấm Poller để publish các dòng outbox chưa publish. Bật "Crash giữa publish và update" để
thấy dòng outbox vẫn published=false → poller lần sau publish LẠI (at-least-once) →
cần idempotent consumer. So sánh với nút "Dual-write (không outbox)" để thấy event bị mất.
📦 orders
| id | user | total |
|---|---|---|
| trống | ||
📨 outbox
| event | published |
|---|---|
| trống | |
3. Event vs Command vs Query — phân loại
Với mỗi thông điệp, chọn loại đúng. Mẹo: tên quá khứ + "đã xảy ra" → Event; mệnh lệnh + có thể bị từ chối → Command; "cho tôi xem" → Query.