Learning Outcome & Exercises: Spring Reactive
Tổng kết chương Spring Reactive: 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/spring-reactive.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Chứng minh bằng StepVerifier thứ tự phát của flatMap, concatMap và flatMapSequential.
- Giới hạn số request downstream đồng thời bằng tham số concurrency của flatMap và đo được giới hạn đó.
- Viết test success / error / timeout / cancel bằng virtual time, không chờ thật.
- Cô lập thư viện blocking trên boundedElastic và chứng minh block() trên thread non-blocking bị từ chối.
2. Basic: Thứ tự của operator
Trạng thái: ✅ Đã có code + test pass (2026-10-15)
3 SKU trễ 300/100/200ms: viết test thứ tự cho flatMap, concatMap, flatMapSequential; giới hạn flatMap 4 request đồng thời.
Bài liên quan: Mono & Flux, Operator hay dùng
Hoàn thành khi:
- 4 test pass bằng virtual time
- maxInFlight = 4 trong log
Bằng chứng: OperatorOrderingTest trong labs/spring-reactive (thư mục evidence/).
3. Intermediate: StepVerifier 3 luồng + cancel
Trạng thái: ✅ Đã có code + test pass (2026-10-15)
Test success, error (có fallback), timeout 5s chạy trong vài ms, cancel lan ngược lên nguồn; blocking call chạy trên boundedElastic.
Bài liên quan: Lỗi, timeout, retry, Schedulers, StepVerifier
Hoàn thành khi:
- 6 test pass
- Thời gian thật của test timeout < 2s
Bằng chứng: StepVerifierScenariosTest trong labs/spring-reactive (thư mục evidence/).
4. Challenge: MVC vs WebFlux dưới tải
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Hai app (MVC + JDBC, WebFlux + WebClient) gọi chung downstream trễ 2s; đo p95, throughput, số thread ở 50/200 client. Không kết luận WebFlux luôn nhanh hơn.
Bài liên quan: Vì sao cần reactive, WebFlux & WebClient, MVC, WebFlux hay virtual threads
Hoàn thành khi:
- Bảng số đo cùng điều kiện
- Giải thích kết quả theo số thread bị giữ
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 | Thứ tự của operator | ✅ Đã có code + test pass (2026-10-15) | OperatorOrderingTest |
| Intermediate | StepVerifier 3 luồng + cancel | ✅ Đã có code + test pass (2026-10-15) | StepVerifierScenariosTest |
| Challenge | MVC vs WebFlux dưới tải | ⬜ 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/spring-reactive. 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ề Spring Reactive, câu nào hay gặp nhất và trả lời sao?
Q1. Bọc JDBC trong CompletableFuture.supplyAsync có thành non-blocking không?
🇻🇳 Tiếng Việt:
Không. Async chỉ chuyển việc chờ sang thread khác; thread worker vẫn bị JDBC giữ suốt thời gian chờ. Non-blocking nghĩa là không thread nào bị giữ khi chờ I/O, cần driver non-blocking như R2DBC hoặc WebClient.
🇬🇧 English:
No. Async only moves the waiting to another thread; a worker thread is still held by JDBC while it waits. Non-blocking means no thread is held while waiting for I/O, which needs a non-blocking driver such as R2DBC or WebClient.
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 (Thứ tự của operator) được coi là xong khi nào?
4 test pass bằng virtual time; maxInFlight = 4 trong log. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (StepVerifier 3 luồng + cancel) được coi là xong khi nào?
6 test pass; Thời gian thật của test timeout < 2s. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (MVC vs WebFlux dưới tải) được coi là xong khi nào?
Bảng số đo cùng điều kiện; Giải thích kết quả theo số thread bị giữ. Chưa có code chạy và bằng chứng thì chưa tính là xong.