Learning Outcome & Exercises: Spring Reactive

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 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:

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:

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:

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:

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
BasicThứ tự của operator✅ Đã có code + test pass (2026-10-15)OperatorOrderingTest
IntermediateStepVerifier 3 luồng + cancel✅ Đã có code + test pass (2026-10-15)StepVerifierScenariosTest
ChallengeMVC 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.

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


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.