Learning Outcome & Exercises: Distributed Systems
Tổng kết chương Distributed Systems: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/distributed.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Chứng minh outbox ghi order và event trong cùng transaction, và event không mất khi broker sập.
- Tái hiện redelivery khi relay crash và xử lý trùng bằng inbox để tác dụng nghiệp vụ chạy đúng một lần.
- Xây read model CQRS có checkpoint: đo projection lag, replay idempotent, rebuild và upcast event cũ.
- Thiết kế saga có compensation và timeout cho Order–Inventory–Payment.
2. Basic: Outbox + Inbox
Trạng thái: ✅ Đã có code + test pass (2026-10-15)
Lỗi giữa insert order và insert outbox phải rollback cả hai; relay chết sau publish → broker nhận 2 lần, shipment tạo đúng 1 lần.
Bài liên quan: Outbox, Inbox, CDC, Timeout, retry, deadline
Hoàn thành khi:
- 3 test pass
- README giải thích at-least-once
Bằng chứng: OutboxInboxTest trong labs/distributed (thư mục evidence/).
3. Intermediate: CQRS read model
Trạng thái: ✅ Đã có code + test pass (2026-10-15)
Event store có optimistic concurrency, projection có checkpoint; đo lag, replay trùng, rebuild bằng read model đang chạy, upcast event v1.
Bài liên quan: CQRS & Event Sourcing, Consistency & CAP
Hoàn thành khi:
- 5 test pass
- Log lag trước/sau poll
Bằng chứng: CqrsEventSourcingTest trong labs/distributed (thư mục evidence/).
4. Challenge: Saga có compensation
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Orchestrator Order → reserve Inventory → charge Payment; payment lỗi/timeout → release inventory; mỗi bước idempotent.
Bài liên quan: Saga, Order–Inventory–Payment end-to-end, Circuit breaker, bulkhead
Hoàn thành khi:
- Test happy path, payment fail, payment timeout
- State machine của saga trong README
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Outbox + Inbox | ✅ Đã có code + test pass (2026-10-15) | OutboxInboxTest |
| Intermediate | CQRS read model | ✅ Đã có code + test pass (2026-10-15) | CqrsEventSourcingTest |
| Challenge | Saga có compensation | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/distributed. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Distributed Systems, câu nào hay gặp nhất và trả lời sao?
Q1. Vì sao cần Outbox, sao không ghi DB xong gửi Kafka luôn?
🇻🇳 Tiếng Việt:
Hai thao tác đó không cùng transaction: DB commit rồi mà gửi Kafka lỗi thì mất event, gửi trước rồi DB rollback thì có event ma. Outbox ghi event vào DB cùng transaction, relay gửi sau theo at-least-once và consumer xử lý trùng bằng inbox.
🇬🇧 English:
The two writes are not in one transaction: if the DB commits and the Kafka send fails we lose the event, and if we send first and the DB rolls back we publish a ghost event. The outbox writes the event in the same transaction, a relay publishes it at least once, and consumers deduplicate with an inbox.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Outbox + Inbox) được coi là xong khi nào?
3 test pass; README giải thích at-least-once. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (CQRS read model) được coi là xong khi nào?
5 test pass; Log lag trước/sau poll. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Saga có compensation) được coi là xong khi nào?
Test happy path, payment fail, payment timeout; State machine của saga trong README. Chưa có code chạy và bằng chứng thì chưa tính là xong.