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.

Order
tạo đơn
Payment
trừ tiền
Inventory
giữ hàng
Shipping
giao hàng
Bấm "Chạy luồng" để bắt đầu…

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

idusertotal
trống

📨 outbox

eventpublished
trống
Bấm CreateOrder để bắt đầu…

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.