Learning Outcome & Exercises: Distributed Systems

2 câu hỏi~10 phút đọc, vài giờ làm labTừ khóa: learning outcome, Basic, Intermediate, Challenge, evidence

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:

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:

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:

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:

5. Tiêu chí hoàn thành chung

6. Lab và trạng thái

MứcBài tậpTrạng tháiTest / bằng chứng
BasicOutbox + Inbox✅ Đã có code + test pass (2026-10-15)OutboxInboxTest
IntermediateCQRS read model✅ Đã có code + test pass (2026-10-15)CqrsEventSourcingTest
ChallengeSaga 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.

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


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.