ในยุคที่เว็บแอปพลิเคชันต้องรองรับผู้ใช้งานจำนวนมาก ความสามารถในการประมวลผลแบบ asynchronous และ non-blocking กลายเป็นสิ่งจำเป็น การเขียนโปรแกรมแบบ Reactive จึงเข้ามามีบทบาท และ Spring WebFlux เป็นหนึ่งในเครื่องมือสำคัญที่ใช้แนวคิดนี้อย่างเต็มรูปแบบ
Reactive Programming คืออะไร?
Reactive Programming เป็น paradigm ในการพัฒนาโปรแกรมที่เน้นการตอบสนองต่อ event หรือข้อมูลที่ไหลเข้ามาแบบต่อเนื่อง โดยที่ระบบสามารถประมวลผลได้แม้ในขณะรอข้อมูลหรือ event จากภายนอก คอนเซ็ปต์หลักประกอบด้วย:
- Asynchronous: ไม่บล็อก thread รอผลลัพธ์
- Event-driven: ตอบสนองต่อ event ที่เกิดขึ้น
- Backpressure: ควบคุมการไหลของข้อมูลเพื่อไม่ให้ overload
- Data Streams: ทำงานกับข้อมูลในรูปแบบ stream ต่อเนื่อง
ภาพประกอบ: แนวคิด Reactive Streams

ใน Reactive Streams มี 4 องค์ประกอบสำคัญ:
- Publisher: แหล่งข้อมูล เช่น database หรือ external API
- Subscriber: ผู้รับข้อมูล เช่น component UI หรือ service
- Subscription: ตัวควบคุมการเชื่อมต่อ
- Processor: ตัวกลางที่สามารถเป็นทั้ง Publisher และ Subscriber
Spring WebFlux กับ Reactive Programming
Spring WebFlux รองรับ reactive โดยใช้ Project Reactor เป็น engine หลัก ซึ่งมี 2 class สำคัญคือ:
- Mono<T>: แสดงค่าหรือ error เพียงหนึ่งค่า
- Flux<T>: แสดงค่าหลายค่าหรือ stream ของข้อมูล
ตัวอย่าง: Mono และ Flux
Mono<String> mono = Mono.just("Hello");
Flux<String> flux = Flux.just("A", "B", "C");
ตัวอย่าง Controller แบบ Reactive
@RestController
public class HelloController {
@GetMapping("/mono")
public Mono<String> mono() {
return Mono.just("Hello Mono");
}
@GetMapping("/flux")
public Flux<String> flux() {
return Flux.just("Spring", "Web", "Flux");
}
}
การใช้งาน RouterFunction แบบ Functional
WebFlux รองรับการเขียน routing แบบ functional style ด้วย:
@Configuration
public class RouterConfig {
@Bean
public RouterFunction<ServerResponse> route() {
return RouterFunctions.route(GET("/hello"),
req -> ServerResponse.ok().bodyValue("Hello WebFlux"));
}
}
ข้อดีของ Reactive Programming
- ประหยัด thread และ resource
- รองรับ concurrent user ได้มากขึ้น
- เหมาะกับระบบที่มี latency สูง เช่น call external API
- ปรับตัวได้กับ system ที่ใช้ stream data เช่น IoT
ข้อเสียของ Reactive Programming
- Debugging ยากกว่าระบบ synchronous
- ต้องเปลี่ยน mindset จาก imperative เป็น reactive
- บาง library ยังไม่รองรับ reactive อย่างเต็มที่
Reactive กับ Blocking ต่างกันอย่างไร?
| คุณสมบัติ | Blocking (Spring MVC) | Reactive (WebFlux) |
|---|---|---|
| Thread per request | ใช่ | ไม่ |
| Scalability | จำกัดด้วย thread | สูงมาก |
| เหมาะกับ | CRUD application | Streaming, Real-time app |
เมื่อไรควรใช้ Reactive Programming?
- ระบบต้องรองรับ concurrent connection หลายพันราย
- ต้อง call external system บ่อย เช่น REST API หรือ Database
- ระบบมี flow ของข้อมูลแบบ stream เช่น live feed, sensor
แหล่งเรียนรู้เพิ่มเติม
สรุป
การเข้าใจ Reactive Programming เป็นพื้นฐานสำคัญในการใช้งาน Spring WebFlux อย่างมีประสิทธิภาพ หากคุณกำลังพัฒนาแอปพลิเคชันสมัยใหม่ที่เน้นความเร็ว ขนาด และความสามารถในการตอบสนองสูง การเปลี่ยนจาก MVC สู่ Reactive คือก้าวสำคัญในการออกแบบระบบแห่งอนาคต