ในยุคที่เว็บแอปพลิเคชันต้องรองรับผู้ใช้งานจำนวนมาก ความสามารถในการประมวลผลแบบ 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 คือก้าวสำคัญในการออกแบบระบบแห่งอนาคต