Learning Outcome & Exercises: Messaging
Tổng kết chương Messaging: 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/messaging.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Chứng minh Kafka giữ thứ tự theo partition khi dùng orderId làm key, và không đảm bảo thứ tự toàn topic.
- Tái hiện redelivery khi consumer chết trước khi commit offset và xử lý trùng bằng bảng idempotency.
- Cấu hình RabbitMQ quorum queue có delivery-limit và DLX, quan sát poison message rơi vào DLQ.
2. Basic: Exchange & routing
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Topic exchange gửi order.created / order.paid tới 2 queue; manual ack và publisher confirm.
Bài liên quan: RabbitMQ: exchange & routing, RabbitMQ: ACK & publisher confirm
Hoàn thành khi:
- Log message theo routing key
- Nack khi lỗi
3. Intermediate: Kafka partition & offset
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Topic 3 partition, 2 rồi 4 consumer cùng group; 100 event cho 5 orderId; ghi key, partition, offset, consumer.
Bài liên quan: Kafka: partitioned log, Kafka: consumer group & offset
Hoàn thành khi:
- Thứ tự đúng trong mỗi orderId
- Giải thích consumer nhàn rỗi khi 4 > 3 partition
4. Challenge: Failure lab
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Kill consumer trước khi commit → redelivery, xử lý trùng bằng inbox; restart một broker khi acks=all, min.insync.replicas=2; poison message vượt x-delivery-limit vào DLQ.
Bài liên quan: RabbitMQ: quorum queue, RabbitMQ: retry, TTL, DLX, Kafka: replication, Kafka: delivery semantics & transaction
Hoàn thành khi:
- Log từng failure
- Cần Docker Compose — ghi rõ nếu chưa chạy
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 | Exchange & routing | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Kafka partition & offset | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Failure lab | ⬜ 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/messaging. 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ề Messaging, câu nào hay gặp nhất và trả lời sao?
Q1. Kafka đảm bảo thứ tự message như thế nào?
🇻🇳 Tiếng Việt:
Chỉ trong từng partition. Em chọn key theo aggregate cần giữ thứ tự, ví dụ orderId, để mọi event của một order vào cùng partition; toàn topic thì không có thứ tự.
🇬🇧 English:
Only within a partition. I choose the key by the aggregate that needs ordering, such as orderId, so all events of one order go to the same partition; there is no ordering across the whole topic.
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 (Exchange & routing) được coi là xong khi nào?
Log message theo routing key; Nack khi lỗi. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Kafka partition & offset) được coi là xong khi nào?
Thứ tự đúng trong mỗi orderId; Giải thích consumer nhàn rỗi khi 4 > 3 partition. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Failure lab) được coi là xong khi nào?
Log từng failure; Cần Docker Compose — ghi rõ nếu chưa chạy. Chưa có code chạy và bằng chứng thì chưa tính là xong.