Lập trình Reactive cho xử lý song song hơn 20,000+ RPS được chia sẻ bởi người phỏng vấn Naver
Đây là khóa học dành cho những nhà phát triển đang tìm kiếm giải pháp căn bản trong môi trường mà phản hồi chậm dần khi lưu lượng truy cập tăng lên, thread pool nhanh chóng bị cạn kiệt và tình trạng nghẽn cổ chai trở nên nghiêm trọng khi các lượt gọi API bên ngoài tăng cao. Khóa học giúp bạn nhìn nhận vấn đề từ góc độ thay đổi cấu trúc thay vì chỉ đơn thuần là mở rộng máy chủ.
Thông qua khóa học này, trước tiên bạn sẽ hiểu được những hạn chế của mô hình Thread per Request truyền thống trong Spring MVC. Bạn sẽ xác định ở cấp độ mã nguồn lý do tại sao CPU vẫn còn trống nhưng hiệu suất xử lý không tăng lên, và cách thức Blocking I/O thực sự chiếm dụng tài nguyên hệ thống như thế nào.
Tiếp theo, bạn sẽ học về khái niệm và đặc tả chuẩn của Reactive Streams, đồng thời nắm vững cách xử lý luồng dữ liệu bằng Mono và Flux của Reactor. Không chỉ dừng lại ở cách sử dụng đơn thuần, bạn sẽ được trải nghiệm thực tế cách luồng dữ liệu bắt đầu, được tiêu thụ và cách điều chỉnh lưu lượng xử lý. Đặc biệt, bạn cũng sẽ trực tiếp triển khai phương thức thiết kế sử dụng Back Pressure để ngăn ngừa lỗi OOM (Out Of Memory) hoặc quá tải.
Ngoài ra, bạn sẽ hiểu về cấu trúc xử lý dựa trên Event Loop của Spring WebFlux và tiến hành thực hành so sánh cách Non-Blocking I/O hoạt động trong quá trình xử lý yêu cầu thực tế. Bằng cách đặt MVC và WebFlux cạnh nhau để xác nhận sự khác biệt về cấu trúc, bạn cũng sẽ đúc kết được tiêu chí đánh giá khi nào nên lựa chọn Reactive.
Khóa học không chỉ dừng lại ở mức độ "học về bất đồng bộ". Bạn sẽ học được cách xử lý nhiều yêu cầu hơn với ít thread hơn, cách duy trì luồng ổn định trong môi trường phụ thuộc nhiều vào API bên ngoài, và tư duy thiết kế để đảm bảo hiệu suất xử lý trong môi trường có tính đồng thời cao.
Khóa học Lập trình Reactive do người phỏng vấn Naver hướng dẫn nhằm xử lý song song hơn 20,000 RPS là khóa học mà tôi đã tham gia để mở rộng hiểu biết về cấu trúc máy chủ và phương thức xử lý thời gian thực trong khi thực hiện dự án liên kết doanh nghiệp SSAFY.
Trong dự án hiện tại, có nhiều tình huống cần phải cân nhắc về cấu trúc xử lý phản hồi và tính đồng thời như liên kết máy chủ AI, xử lý dữ liệu thời gian thực, giao tiếp API bên ngoài, v.v. Đúng vào thời điểm tôi đang thắc mắc về những hạn chế của cấu trúc dựa trên Spring MVC truyền thống, khóa học này đã giúp ích rất nhiều trong việc thấu hiểu luồng tổng quát về Lập trình Reactive và WebFlux.
Đặc biệt, tôi rất thích cách giải thích đi kèm với thực hành thay vì chỉ là lý thuyết suông về các khái niệm như sự khác biệt giữa cấu trúc Thread per Request và cấu trúc dựa trên Event Loop, phương thức xử lý luồng dữ liệu (data stream) sử dụng Mono và Flux, hay khái niệm kiểm soát quá tải thông qua Back Pressure. Trước đây, tôi chỉ đơn thuần nghĩ WebFlux là một "framework bất đồng bộ", nhưng qua khóa học này, tôi đã cảm nhận được rằng đây là một cách tiếp cận mang tính cấu trúc để xử lý tính đồng thời cao với ít tài nguyên.
Mặc dù tôi chưa áp dụng WebFlux ngay lập tức vào dự án liên kết doanh nghiệp đang thực hiện, nhưng những khái niệm học được từ khóa học này đã giúp ích rất nhiều trong quá trình cân nhắc cấu trúc tính năng thời gian thực hoặc giao tiếp với máy chủ AI. Đặc biệt, tầm nhìn của tôi về sự khác biệt giữa Blocking I/O và Non-blocking, cũng như các vấn đề nghẽn cổ chai có thể xảy ra khi có nhiều lượt gọi API bên ngoài, đã được mở rộng hơn trước.
Ngoài ra, việc khóa học đề cập đến cả những nội dung cần cân nhắc trong thực tế như SSE, WebSocket, Retry pattern, luồng xử lý lỗi, v.v., đã mang lại cho tôi những trải nghiệm vượt xa việc chỉ học cú pháp đơn thuần.
Tôi nghĩ rằng trong tương lai, khi quy mô dự án lớn hơn hoặc trong môi trường đòi hỏi xử lý tính đồng thời cao và liên kết bên ngoài nhiều hơn, tôi chắc chắn muốn cân nhắc việc thực sự áp dụng WebFlux và cấu trúc Reactive. Đây là một khóa học giúp tôi có được tiêu chí đánh giá để lựa chọn công nghệ phù hợp trong từng tình huống, thay vì chỉ tiếp cận Reactive như một xu hướng công nghệ đơn thuần.
5.0
goldrex123
100% đã tham gia
Đây là khóa học giúp bạn có thể tìm hiểu tổng quan về WebFlux :)
Bạn sẽ nhận được điều này sau khi học.
Cách thiết kế và triển khai trực tiếp máy chủ Non-Blocking dựa trên Spring WebFlux
Khả năng thiết kế và kiểm soát luồng dữ liệu (data stream) bằng cách sử dụng Mono và Flux
Năng lực thiết kế cấu trúc áp dụng Back Pressure để ngăn ngừa quá tải
Khả năng giải thích sự khác biệt về cấu trúc giữa MVC và WebFlux và đưa ra tiêu chí lựa chọn
Kỹ thuật thiết kế kiến trúc xử lý tính đồng thời cao với ít luồng (thread)
Khả năng nhận diện và giải quyết các vấn đề phát sinh khi sử dụng kết hợp mã chặn (blocking code) và mã phản ứng (reactive code)
Phát triển · Lập trình · Backend
Thay vì tăng thêm máy chủ, chúng ta thay đổi cấu trúc Lập trình Reactive không làm tắc nghẽn luồng (thread)
Khóa học này không chỉ dừng lại ở việc giải thích Reactive bằng duy nhất từ khóa "bất đồng bộ", mà là một khóa học thực hành tập trung vào cấu trúc xử lý nhiều yêu cầu hơn với cùng một nguồn tài nguyên. Mục tiêu là xây dựng cấu trúc có thể tiếp nhận hơn 20,000 yêu cầu mỗi giây mà không cần tăng số lượng thread. Bắt đầu từ Reactive Streams và Back Pressure, bạn sẽ trực tiếp sử dụng Mono và Flux của Reactor, sau đó tiến xa hơn đến các mô hình thực tế dựa trên Spring WebFlux.
Mức độ: Nhập môn
Trọng tâm thực hành
Java 17 · Spring Boot
Thời hạn khóa học vô hạn
Thread per Request → Event LoopGóc nhìn thay đổi chính cấu trúc
Từ khái niệm đến các mô hình thực tếhầu hết thời gian sẽ là các bài thực hành
Mono · Flux · Back PressureXác nhận bằng mã nguồn thay vì chỉ là khái niệm
Chương trình học được xây dựng bởi nhà phát triển máy chủ Naver với 10 năm kinh nghiệm Mặc dù độ khó ở mức nhập môn, nhưng các mô hình thực tế trong phần 5 và 6 sẽ là những nội dung mới mẻ ngay cả với những người đã đang sử dụng WebFlux Môi trường thực hành là macOS (Apple M3) · Java 17 · Docker
Spring WebFlux · Framework web reactive non-blockingĐặc tả Reactive StreamsBack Pressure ngăn chặn OOMKhác biệt cấu trúc giữa Spring MVC vs WebFluxReactor · Bản thực thi do đội ngũ Spring tạo raMono phát hành 0~1 phần tửFlux phát hành từ 0 phần tử trở lênXử lý dựa trên Event LoopKhả năng đồng thời cao với ít threadXử lý song song · Giải quyết nghẽn cổ chai khi gọi API bên ngoàiJava 17 · Spring · Spring BootSpring WebFlux · Framework web reactive non-blockingĐặc tả Reactive StreamsBack Pressure ngăn chặn OOMKhác biệt cấu trúc giữa Spring MVC vs WebFluxReactor · Bản thực thi do đội ngũ Spring tạo raMono phát hành 0~1 phần tửFlux phát hành từ 0 phần tử trở lênEvent Loop dựa trên xử lýKhả năng đồng thời cao với ít threadXử lý song song · Giải quyết nghẽn cổ chai khi gọi API bên ngoàiJava 17 · Spring · Spring Boot
Lý do khóa học này bắt đầu
Bắt đầu từ lời than vãn rằng tất cả các luồng (thread) đều bị tắc nghẽn
Dưới đây là nội dung cuộc trò chuyện thực tế. Đó là cuộc đối thoại giữa một nhà phát triển tại Toss, người đang gặp vấn đề về lưu lượng truy cập quá tải, và một nhà phát triển tại Naver, người đã thử chuyển đổi một số dịch vụ sang WebFlux.
Nhân viên phát triển TossDạo này traffic cứ nổ liên tục... CPU thì vẫn ổn nhưng thread không chịu nổi nên bị nghẽn hết rồi ㅠㅠ
HongToss đang dùng cấu trúc nào vậy? Đang xử lý theo cấu trúc Thread per Request à?
Nhà phát triển TossỪ... Hầu hết đều dựa trên MVC nên khi các cuộc gọi API bên ngoài tăng lên, các đoạn blocking sẽ gây ra hiện tượng thắt nút cổ chai. Cảm giác như dù có tăng thêm hạ tầng thì cũng không giải quyết được tận gốc vấn đề.
Ande (Naver)Thực ra vì vậy nên tôi hơi ghét điều đó. Dù ưu nhược điểm rất rõ ràng... nhưng tôi nghĩ về mặt thông lượng thì không gì có thể theo kịp Reactive. Tất nhiên là sẽ có chút khó khăn khi mới bắt đầu học ㅠ
Ande (Naver)Vì vậy, tôi đã chuyển đổi một số dịch vụ sang cấu trúc Reactive dựa trên WebFlux. Dù không phải tất cả mà chỉ thay đổi một phần sang non-blocking, nhưng thông lượng trên cùng một tài nguyên vẫn đáp ứng rất tốt
Ande (Naver)Chỉ biết Mono và Flux thôi thì không giải quyết được tất cả đâu. Tôi nghĩ cần phải cân nhắc đến cả Event Loop, Back Pressure và việc sử dụng hỗn hợp các mã chặn (blocking code) nữa
HongÀ.... tiêu rồi ㅋㅋㅋㅋㅋ mình không cố ý làm vậy đâu mà;;
Nhà phát triển TossTôi thì thích quá rồi ㅋㅋㅋ Cực kỳ đề xuất luôn!!! Tôi cũng sẽ nghe thử một lần
Đó là cách mà khóa học này được tạo ra. Những nội dung mà người trực tiếp chuyển đổi nhấn mạnh rằng "cần phải biết đến mức này" đã trở thành chương trình giảng dạy y như vậy.
“
Xét về khía cạnh hiệu suất xử lý, không gì có thể theo kịp Reactive.
Nhà phát triển máy chủ hiện đang làm việc tại trụ sở Naver10 năm kinh nghiệm · Trực tiếp chuyển đổi một số dịch vụ sang WebFlux
Những gì bạn đang trải qua hiện tại
Liệu nhà phát triển backend chỉ cần giỏi phương thức đồng bộ là đủ rồi sao?
Nếu hệ thống vẫn đang vận hành tốt dựa trên Spring MVC truyền thống thì đó là một điều may mắn. Tuy nhiên, khi lưu lượng truy cập bắt đầu tăng lên, các vấn đề sau sẽ lần lượt xuất hiện.
Khi các lượt gọi API bên ngoài tăng lên, tốc độ phản hồi ngày càng chậm lại
CPU vẫn còn dư dả nhưng thread pool lại nhanh chóng bị cạn kiệt
Lưu lượng truy cập tăng lên nhưng chi phí cơ sở hạ tầng cũng tăng theo
Định chuyển sang bất đồng bộ thì mã nguồn ngày càng trở nên phức tạp
Việc duy trì bằng cách tăng thêm máy chủ và việc tiếp nhận nhiều hơn với cùng một nguồn lực là hai câu chuyện khác nhau.
Tại sao chọn Spring WebFlux
Spring WebFlux có gì khác biệt?
Spring WebFlux là một framework web reactive dựa trên nền tảng non-blocking. Nếu như Spring MVC truyền thống sử dụng mô hình Thread per Request (mỗi yêu cầu một luồng), thì WebFlux hoạt động dựa trên cấu trúc vòng lặp sự kiện (event loop). Nó có thể được sử dụng trực tiếp trên nền tảng Java và Spring Boot.
Non-Blocking I/O
WebFlux는 요청을 처리하는 동안 스레드를 붙잡지 않아, 적은 스레드로도 높은 동시성을 감당합니다.
Back Pressure
WebFlux는 리액티브 스트림 표준을 따라, 데이터를 만드는 쪽과 쓰는 쪽의 속도를 맞춰 과부하를 막습니다.
Vòng lặp sự kiện (Event Loop)
WebFlux는 요청마다 스레드를 배정하지 않고 이벤트 루프로 처리해, 동시 요청이 많은 환경에서 유리합니다.
Khả năng xử lý đồng thời cao
WebFlux는 외부 API 호출이나 DB I/O처럼 기다리는 시간이 긴 작업에서 스레드를 막지 않아 고트래픽에 강합니다.
Mono · Flux
Reactor의 Mono는 0~1개, Flux는 0개 이상의 데이터를 발행하는 타입입니다. 병렬 처리의 출발점이 이 둘입니다.
Functional
WebFlux는 Spring MVC와 비슷한 애노테이션 방식은 물론, RouterFunction을 활용한 함수형 구성도 지원합니다.
Tài liệu chính thức mô tả Spring WebFlux như thế này.
Spring WebFlux, một framework web dạng reactive-stack, đã được thêm vào từ phiên bản 5.0. Nó hoạt động hoàn toàn theo cơ chế non-blocking, hỗ trợ back pressure của Reactive Streams và chạy trên các máy chủ như Netty cũng như các servlet container.
Spring WebFlux, một framework web stack reactive, đã được thêm vào từ phiên bản 5.0. Nó hoạt động hoàn toàn theo cơ chế non-blocking, hỗ trợ Back Pressure của Reactive Streams và có thể chạy trên các máy chủ như Netty cũng như các servlet container truyền thống. spring-webmvc và spring-webflux cùng tồn tại song song trong Spring Framework và có thể được sử dụng cùng nhau nếu cần thiết.
Có những điều cần kiểm tra trước khi mở rộng cơ sở hạ tầng
Bắt đầu từ việc tìm hiểu Reactive là gì cho đến các mô hình thực tế của WebFlux.
Tôi đã trích dẫn nguyên văn thông báo tuyển dụng nhà phát triển server. Trong đó, yêu cầu về kinh nghiệm xử lý lưu lượng truy cập lớn (traffic) và xử lý bất đồng bộ/non-blocking đã được đưa vào.
TossJD Nhà phát triển Server
Toss PaymentsJD Nhà phát triển Server
Công ty con của Daou KiwoomJD Nhà phát triển Server
Hecto GroupJD Phát triển Server
Đặc điểm của bài giảng này
Tại sao lại là khóa học lập trình Reactive này?
Dựa trên kinh nghiệm chuyển đổi trong môi trường nền tảng Naver
Đây không phải là bài giảng chỉ liệt kê các cú pháp WebFlux. Chúng tôi sẽ giải thích từ bối cảnh thực tế: những vấn đề nào đã phát sinh trong môi trường có lưu lượng truy cập lớn và phụ thuộc nhiều vào API bên ngoài, và tại sao cấu trúc Reactive lại được lựa chọn.
Hầu hết thời gian đều là thực hành
Reactive không thể chỉ cảm nhận được qua lý thuyết. Bạn phải trực tiếp kiểm tra luồng hoạt động của Mono và Flux, phương thức xử lý non-blocking và cấu trúc Event Loop thông qua code thì mới có thể thực sự thấu hiểu được.
Giải thích bằng sự khác biệt về cấu trúc so với MVC
"비동기"라는 단어 하나로는 부족합니다. Thread per Request 모델의 한계, 블로킹 구간이 만드는 병목, 논블로킹 아키텍처의 동작 방식을 나란히 놓고 비교합니다.
Tầm nhìn cho cấp Junior, tiêu chuẩn lựa chọn cho cấp Senior
WebFlux không phải là một công nghệ chạy theo xu hướng, mà là một trong những lựa chọn trong môi trường có độ đồng thời cao (high concurrency). Khóa học sẽ đề cập đến cả việc khi nào nên chọn và khi nào không nên chọn nó.
Những gì thay đổi sau khóa học
Sau khi kết thúc khóa học này, tôi có thể làm được những gì?
Dưới đây là năm điều mà bạn có thể tự tay lập trình hoặc giải thích kèm theo căn cứ rõ ràng trong các buổi phỏng vấn sau khi hoàn thành khóa học.
Phán đoán
지금 겪는 병목이 스레드 대기 때문인지 CPU 때문인지 구분하고, WebFlux가 답인 상황인지 아닌지 고를 수 있습니다.
Thực hiện
Mono와 Flux로 단건·다건 흐름을 표현하고, 연산자를 조합해 여러 외부 호출을 병렬로 묶을 수 있습니다.
Kiểm soát luồng
생산 속도가 소비 속도를 앞지를 때 Back Pressure로 조절해 메모리가 터지는 상황을 막을 수 있습니다.
Tránh né rủi ro
리액티브 체인 안에 블로킹 코드가 섞였을 때 왜 위험한지 설명하고, 그 지점을 찾아낼 수 있습니다.
Chuyển đổi
기존 MVC 프로젝트 전체를 갈아엎지 않고 필요한 구간만 논블로킹으로 바꾸는 방식을 설계할 수 있습니다.
Khuyên dùng cho những đối tượng sau
Khóa học lập trình Reactive này dành cho những ai?
Nhà phát triển backend lo lắng về việc cạn kiệt thread pool khi lưu lượng truy cập tăng lên
Nhà phát triển Spring cảm thấy những hạn chế của cấu trúc MVC nhưng vẫn chưa tìm được giải pháp thay thế
Những nhà phát triển muốn áp dụng Reactive nhưng vẫn chưa thể bắt đầu vì khái niệm còn quá mơ hồ.
Nhà phát triển trong một nhóm đang gặp gánh nặng về chi phí do chỉ giải quyết vấn đề bằng cách mở rộng cơ sở hạ tầng.
Nhà phát triển nền tảng đang lo lắng về sự chậm trễ trong giao tiếp giữa các dịch vụ trong môi trường MSA
Nhà phát triển đang khao khát phát triển sự nghiệp do thiếu kinh nghiệm thiết kế môi trường có tính đồng thời cao (high concurrency).
Ngược lại, nếu bạn có thể giải thích ngay lập tức Back Pressure hoạt động ở đâu, tại sao việc trộn lẫn mã blocking lại nguy hiểm, và nên chọn cái nào giữa MVC và WebFlux, thì bạn không cần đến khóa học này.
Chương trình giảng dạy
Chương trình giảng dạy khóa học lập trình Reactive
Khóa học được cấu trúc theo trình tự dành cho những lập trình viên mới bắt đầu học về Reactive. Bắt đầu từ khái niệm và đặc tả kỹ thuật, tiếp nối đến cơ bản về Reactor, các toán tử (operators), các mẫu thực tế (patterns) và ứng dụng dựa trên Spring Boot.
Phần 1. Giới thiệu khóa học
Giới thiệu khóa học
Spring Reactive & Spring WebFlux
Phần 2. Tất cả về Lập trình Reactive
Lập trình Reactive thực chất là gì
Thông số kỹ thuật của Reactive Streams được tiêu chuẩn hóa và sử dụng trong hệ sinh thái Java
Hiệu quả của kiểm soát dòng chảy (Back Pressure) để ngăn chặn lỗi OOM trong cấu trúc luồng dữ liệu
Sự khác biệt và những lưu ý giữa Spring MVC và Spring WebFlux
Phần 3. Cơ bản về sử dụng WebFlux Reactor
Giới thiệu và thực hành về Reactor được tạo bởi đội ngũ Spring Framework
Cách sử dụng cơ bản và cốt lõi của Reactor Mono phát hành từ 0 đến 1 dữ liệu
Các kiến thức cơ bản còn lại như Flux phát hành từ 0 dữ liệu trở lên
Phần 4. Các toán tử đa dạng của WebFlux Reactor
Thực hành các toán tử để chuyển đổi, kết hợp và lọc dữ liệu.
Phần 5. Các mô hình thực tế tùy chọn trong WebFlux
Nội dung này đề cập đến các tình huống ngoại lệ gặp phải trong thực tế và các mô hình ứng phó.
Phần 6. Các mẫu vận dụng WebFlux dựa trên Spring Boot
Kết thúc bằng các mẫu cấu hình WebFlux thực tế trên nền tảng Spring Boot.
Công nghệ được đề cập · Môi trường thực hành
Thực hành bằng cái gì?
webflux
Reactor
Mono · Flux
Back Pressure
Reactive Streams
Vòng lặp sự kiện (Event Loop)
Xử lý song song
Java
Spring
Spring Boot
Docker
macOS (Apple M3)
Được thực hiện trong môi trường Apple M3 Air với Java 17.0.12 LTS, và khi cần thiết sẽ thiết lập môi trường xung quanh bằng Docker(28.0.0).
Nếu bạn đã xem hết cả chương trình học
Thời hạn khóa học là vô hạn. Bạn có thể xem lại bất cứ phần nào mình cần bất cứ lúc nào.
Được tạo ra bởi các nhà phát triển server đang làm việc thực tế
Khóa học này được thực hiện bởi Hong, một nhà phát triển máy chủ nền tảng tại Pangyo, và Ande, một nhà phát triển máy chủ với 10 năm kinh nghiệm tại trụ sở chính của Naver.
Người chia sẻ kiến thức · Phát triển máy chủ nền tảng Pangyo
Hong
Tôi đang đảm nhận việc phát triển máy chủ nền tảng tại Pangyo. Tôi tiếp tục hoạt động với tư cách là người chia sẻ kiến thức để chia sẻ các phương pháp tự học cũng như những vấn đề và giải pháp gặp phải trong thực tế. Các bài giảng không được thực hiện một mình mà được xây dựng cùng với nhiều nhà phát triển khác đang làm việc trong ngành.
[Hiện tại] Nhà phát triển server nền tảng tại Pangyo
Người chia sẻ kiến thức trên Inflearn · Điều hành nhiều bài giảng Backend
[前] Phát triển Backend Blockchain · Metaverse
Naver · Nhà phát triển máy chủ 10 năm kinh nghiệm
Ande
Tôi là nhà phát triển máy chủ backend với 10 năm kinh nghiệm. Tôi thực hiện bài giảng này vì muốn chia sẻ những kỹ thuật và công nghệ mà mình biết với mọi người, đồng thời hy vọng các bạn sẽ không mắc phải những sai lầm mà tôi từng gặp. Tôi đã tham gia dự án này theo lời giới thiệu của một người phỏng vấn tại Kakao và cùng thực hiện quay hình dưới sự dẫn dắt của Hong. Nếu có bất kỳ câu hỏi nào, các bạn cứ thoải mái đặt ra, tôi sẽ kiểm tra và giải đáp sớm nhất có thể.
[現] 네이버 본사 서버 개발자
[前] Cựu lập trình viên Backend thuộc tập đoàn Shinsegae
[前] Nhà phát triển máy chủ tại startup chăm sóc sức khỏe (healthcare)
[前] Tốt nghiệp chuyên ngành Công nghệ thông tin hệ 4 năm tại Seoul
Câu hỏi thường gặp
Câu hỏi thường gặp về khóa học lập trình Reactive
Reactive programming là gì?
Đây là phương thức xem dữ liệu như một luồng (stream) và xử lý mà không giữ chặt (block) luồng (thread) khi luồng dữ liệu đó đổ về. Trong hệ sinh thái Java có một tiêu chuẩn kỹ thuật gọi là Reactive Streams, và Reactor là bản hiện thực (implementation) của phe Spring, còn Spring WebFlux là web framework được xây dựng dựa trên đó. Khái niệm và thông số kỹ thuật sẽ được tóm tắt trước trong Phần 2.
Lập trình Reactive có giống với lập trình bất đồng bộ không?
Không giống nhau. Bất đồng bộ là một khái niệm rộng về việc tiến hành công việc khác mà không chờ đợi kết quả, còn lập trình phản ứng (Reactive Programming) là một mô hình lập trình xử lý luồng bất đồng bộ đó như một luồng dữ liệu (data stream), đồng thời điều chỉnh cả tốc độ sản xuất sao cho phù hợp với tốc độ tiêu thụ. Lý do bài giảng này nói rằng chỉ dùng từ "bất đồng bộ" là chưa đủ chính là nằm ở phần Back Pressure này.
Spring MVC và Spring WebFlux khác nhau như thế nào?
MVC là mô hình Thread per Request (mỗi yêu cầu một luồng), nên nếu các khoảng thời gian chờ như gọi API bên ngoài kéo dài, các luồng sẽ bị giữ lại và gây ra nghẽn cổ chai. WebFlux dựa trên Event Loop và Non-blocking nên sẽ giải phóng luồng trong thời gian chờ. Sự khác biệt và các lưu ý sẽ được đề cập cùng nhau trong bài giảng cuối cùng của Phần 2.
Mono và Flux lần lượt là gì?
Cả hai đều là các kiểu phát dữ liệu (publisher) do Reactor cung cấp. Mono phát ra 0 hoặc 1 dữ liệu, còn Flux phát ra từ 0 dữ liệu trở lên. Việc truy vấn đơn lẻ được biểu diễn bằng Mono, trong khi danh sách hoặc luồng dữ liệu (stream) được biểu diễn bằng Flux. Trong phần 3, chúng ta sẽ cùng thực hành các cách sử dụng cơ bản và cốt lõi của từng loại.
Tại sao cần có Back Pressure (áp suất ngược)?
Nếu bên tạo dữ liệu nhanh hơn bên tiêu thụ, dữ liệu chưa được xử lý có thể tích tụ trong bộ nhớ và dẫn đến lỗi OOM (Out Of Memory). Back Pressure là cơ chế điều tiết luồng dữ liệu để bên tiêu thụ chỉ yêu cầu lượng dữ liệu mà họ có thể xử lý được. Nội dung này sẽ được đề cập trong Phần 2 dưới góc độ ngăn ngừa OOM.
Dùng WebFlux thì có chắc chắn nhanh hơn không?
Không. WebFlux phát huy thế mạnh trong các tình huống có nhiều lượt gọi API bên ngoài hoặc chờ đợi I/O khiến các luồng (thread) bị tắc nghẽn. Nếu các phép toán sử dụng CPU trong thời gian dài là điểm nghẽn, thì việc thay đổi cấu trúc cũng không mang lại khác biệt lớn, và nếu trộn lẫn các mã chặn (blocking code) vào giữa thì thậm chí còn gây hại hơn. Khóa học này cũng sẽ đề cập đến các tiêu chí để đưa ra quyết định đó.
Có cần phải chuyển đổi toàn bộ dự án MVC hiện tại sang WebFlux không?
Không cần phải thay đổi toàn bộ. spring-webmvc và spring-webflux cùng tồn tại song song trong Spring Framework, và bạn hoàn toàn có thể chỉ chuyển đổi những dịch vụ cần thiết sang dạng non-blocking. Thực tế, giảng viên cũng đã đưa vào bài giảng này kinh nghiệm nâng cao hiệu suất xử lý trên cùng một nguồn tài nguyên bằng cách chỉ chuyển đổi một phần dịch vụ.
Người mới bắt đầu với Reactive có thể theo kịp không?
Vâng. Đây là khóa học dành cho người mới bắt đầu, lộ trình sẽ đi từ khái niệm Reactive là gì và đặc tả Stream, sau đó đến cơ bản về Reactor, các toán tử (operator) và nâng dần lên các mô hình thực tế (practice patterns). Chỉ cần bạn có kinh nghiệm sử dụng Java và Spring Boot là đủ, còn phần mô hình thực tế ở phía sau sẽ là những nội dung mới mẻ ngay cả với những người đang sử dụng WebFlux.
Môi trường thực hành được cấu hình như thế nào?
Được thực hiện trên Apple M3 Air với Java 17.0.12 LTS, và nếu cần thiết, môi trường xung quanh sẽ được thiết lập bằng Docker 28.0.0. Bạn có thể thực hành toàn bộ trên máy cục bộ (local) mà không cần thanh toán thêm cho bất kỳ dịch vụ đám mây trả phí nào.
Lộ trình giảng dạy lập trình Reactive được sắp xếp theo thứ tự nào vậy?
Bắt đầu từ khái niệm Reactive và đặc tả Reactive Streams, Back Pressure, sự khác biệt với MVC, tiếp nối bằng kiến thức cơ bản về Reactor (Mono·Flux), các toán tử đa dạng, mô hình thực tế, và cuối cùng là cách vận dụng WebFlux dựa trên Spring Boot. Thời hạn khóa học là vô hạn.
Thay vì tăng thêm luồng (thread), chúng ta thiết kế luồng dữ liệu (flow).
Bắt đầu từ việc tìm hiểu Reactive là gì cho đến Mono·Flux và các mô hình thực tế, tất cả sẽ được xác nhận thông qua thực hành.
Tôi đang vận hành một phòng chat mở dành cho các nhà phát triển để chia sẻ về sự nghiệp, tình hình thực tế tại nơi làm việc và các vấn đề kỹ thuật. Đừng ngần ngại chia sẻ những thắc mắc khi nghe bài giảng hoặc những trăn trở trong công việc thực tế nhé.
Tôi bắt đầu học lập trình sau một thời gian dài lười biếng ở nhà và cảm thấy hứng thú với nó, hiện tại tôi đang đảm nhận việc phát triển máy chủ nền tảng (platform server) tại Pangyo. Tôi tiếp tục hoạt động với tư cách là người chia sẻ kiến thức vì muốn cung cấp cho các bạn phương pháp tôi đã học cũng như những vấn đề và giải pháp khác nhau mà các bạn có thể gặp phải trong thực tế.
Bài giảng không chỉ được tạo ra từ kiến thức của riêng tôi. Mọi bài giảng đều có sự đồng hành của những người cộng sự.
Chào bạn Jang Jaehoon, cảm ơn bạn vì những đánh giá tốt!! Mình sẽ cung cấp thêm nhiều bài giảng bổ ích hơn nữa trong tương lai!! Chúc bạn một ngày tốt lành nhé!
Tôi đã xem và rất ấn tượng.. Dù đang làm lập trình viên được 6 năm rồi nhưng bài giảng này vẫn khiến tôi cảm thấy mình còn nhiều thiếu sót.. Tuy là một chủ đề đơn giản nhưng nội dung rất hay và đi sâu vào trọng tâm. Xin cảm ơn bạn.
Khóa học Lập trình Reactive do người phỏng vấn Naver hướng dẫn nhằm xử lý song song hơn 20,000 RPS là khóa học mà tôi đã tham gia để mở rộng hiểu biết về cấu trúc máy chủ và phương thức xử lý thời gian thực trong khi thực hiện dự án liên kết doanh nghiệp SSAFY.
Trong dự án hiện tại, có nhiều tình huống cần phải cân nhắc về cấu trúc xử lý phản hồi và tính đồng thời như liên kết máy chủ AI, xử lý dữ liệu thời gian thực, giao tiếp API bên ngoài, v.v. Đúng vào thời điểm tôi đang thắc mắc về những hạn chế của cấu trúc dựa trên Spring MVC truyền thống, khóa học này đã giúp ích rất nhiều trong việc thấu hiểu luồng tổng quát về Lập trình Reactive và WebFlux.
Đặc biệt, tôi rất thích cách giải thích đi kèm với thực hành thay vì chỉ là lý thuyết suông về các khái niệm như sự khác biệt giữa cấu trúc Thread per Request và cấu trúc dựa trên Event Loop, phương thức xử lý luồng dữ liệu (data stream) sử dụng Mono và Flux, hay khái niệm kiểm soát quá tải thông qua Back Pressure. Trước đây, tôi chỉ đơn thuần nghĩ WebFlux là một "framework bất đồng bộ", nhưng qua khóa học này, tôi đã cảm nhận được rằng đây là một cách tiếp cận mang tính cấu trúc để xử lý tính đồng thời cao với ít tài nguyên.
Mặc dù tôi chưa áp dụng WebFlux ngay lập tức vào dự án liên kết doanh nghiệp đang thực hiện, nhưng những khái niệm học được từ khóa học này đã giúp ích rất nhiều trong quá trình cân nhắc cấu trúc tính năng thời gian thực hoặc giao tiếp với máy chủ AI. Đặc biệt, tầm nhìn của tôi về sự khác biệt giữa Blocking I/O và Non-blocking, cũng như các vấn đề nghẽn cổ chai có thể xảy ra khi có nhiều lượt gọi API bên ngoài, đã được mở rộng hơn trước.
Ngoài ra, việc khóa học đề cập đến cả những nội dung cần cân nhắc trong thực tế như SSE, WebSocket, Retry pattern, luồng xử lý lỗi, v.v., đã mang lại cho tôi những trải nghiệm vượt xa việc chỉ học cú pháp đơn thuần.
Tôi nghĩ rằng trong tương lai, khi quy mô dự án lớn hơn hoặc trong môi trường đòi hỏi xử lý tính đồng thời cao và liên kết bên ngoài nhiều hơn, tôi chắc chắn muốn cân nhắc việc thực sự áp dụng WebFlux và cấu trúc Reactive. Đây là một khóa học giúp tôi có được tiêu chí đánh giá để lựa chọn công nghệ phù hợp trong từng tình huống, thay vì chỉ tiếp cận Reactive như một xu hướng công nghệ đơn thuần.
Chào bạn Seong-hun, mình thực sự rất cảm động ạ ㅠㅠㅠㅠ Đọc những dòng này mình đã được tiếp thêm rất nhiều sức mạnh và đây chính là động lực để mình tiến xa hơn nữa ㅠㅠ Trong thời gian tới, mình sẽ cố gắng cung cấp những bài giảng bổ ích hơn nữa để có thể làm hài lòng bạn trong các bài học tiếp theo.
Chúc bạn một ngày tốt lành nhé!!!